2016-03-04 52 views
5

Tôi có một bảng Users,sql động nhúng trong chọn truy vấn

 
╔════╦═══════╦══════╗ 
║ Id ║ Name ║ Db ║ 
╠════╬═══════╬══════╣ 
║ 1 ║ Peter ║ DB1 ║ 
║ 2 ║ John ║ DB16 ║ 
║ 3 ║ Alex ║ DB23 ║ 
╚════╩═══════╩══════╝ 

và nhiều cơ sở dữ liệu có cấu trúc tương tự (bảng tương tự, cùng một thủ tục, ...), do đó tất cả các cơ sở dữ liệu có một bảng tên Project , và đây là cấu trúc của Project bảng,

 
╔════╦═════════╦═════════════╗ 
║ Id ║ Request ║ Information ║ 
╠════╬═════════╬═════════════╣ 
║ 1 ║  126 ║ XB1   ║ 
║ 2 ║  126 ║ D6   ║ 
║ 3 ║  202 ║ BM-23  ║ 
╚════╩═════════╩═════════════╝ 

Vì vậy, khi tôi truy vấn cơ sở dữ liệu:

SELECT count(distinct([Request])) as nbrRequests 
    FROM [SRV02].[DB1].[dbo].[Project] 

tôi nhận được kết quả này:

 
╔═════════════╗ 
║ NbrRequests ║ 
╠═════════════╣ 
║   2 ║ 
╚═════════════╝ 

Bây giờ, những gì tôi muốn là để "liên kết"/"tham gia" ... kết quả từ bảng Users để truy vấn này, nơi cột Db trong Users bảng là tên cơ sở dữ liệu của tôi, vì vậy tôi có thể nhận được kết quả như sau:

 
╔════╦═══════╦══════╦═════════════╗ 
║ Id ║ Name ║ Db ║ NbrRequests ║ 
╠════╬═══════╬══════╬═════════════╣ 
║ 1 ║ Peter ║ DB1 ║   2 ║ 
║ 2 ║ John ║ DB16 ║   3 ║ 
║ 3 ║ Alex ║ DB23 ║   6 ║ 
╚════╩═══════╩══════╩═════════════╝ 

Tôi đang cố gắng với SQL động, nhưng không có may mắn.

NB: Mỗi người sử dụng chỉ có một cơ sở dữ liệu, và một cơ sở dữ liệu thuộc về chỉ một người dùng, đó là one-to-one mối quan hệ

+1

Có bất kỳ mối liên hệ giữa bảng yêu cầu và bảng người dùng khác với bảng yêu cầu cơ sở dữ liệu ific? Và nếu không, có nhiều người dùng trên mỗi cơ sở dữ liệu không và nếu có thì kết quả sẽ là gì? –

+0

vui lòng chỉ định các quan hệ bảng và cách bạn mong đợi các truy vấn nbrrequests là 2,3,6 – TheGameiswar

+0

Db là liên kết duy nhất và mỗi người dùng chỉ có một cơ sở dữ liệu và cơ sở dữ liệu chỉ thuộc về một người dùng. –

Trả lời

1

Kết hợp những 2 câu trả lời https://stackoverflow.com/a/35795690/1460399https://stackoverflow.com/a/35795189/1460399, tôi có giải pháp này:

DECLARE @Query NVARCHAR(MAX)= 'SELECT u.Id, u.Name, u.Db, dbCts.nbrRequests FROM [Users] u INNER JOIN ('; 

DECLARE @QueryLength INT= LEN(@Query); 

SELECT @Query = @Query 
       +CASE WHEN LEN(@Query) > @QueryLength THEN ' UNION ' ELSE '' END 
       +'SELECT '''+Db+''' as db, count(distinct(Request)) as nbrRequests FROM [SRV02].'+Db+'[Project]' 
FROM Users; 

SET @Query = @Query+') dbCts ON u.Db = dbCts.db'; 

EXECUTE (@Query); 
3

Cách bạn có thể làm đó là với một UNION đếm mỗi bảng cơ sở dữ liệu cụ thể và cho nó một nhận dạng cho các cơ sở dữ liệu, như thế này:

SELECT u.Id, u.Name, u.Db, dbCts.nbrRequests 
    FROM [Users] u INNER JOIN 
     (SELECT 'DB1' as db, count(distinct([Request])) as nbrRequests 
     FROM [SRV02].[DB1].[dbo].[Project] 
     UNION 
     SELECT 'DB16', count(distinct([Request])) as nbrRequests 
     FROM [SRV02].[DB16].[dbo].[Project] 
     UNION 
     SELECT 'DB23', count(distinct([Request])) as nbrRequests 
     FROM [SRV02].[DB23].[dbo].[Project] 
    ) dbCts ON u.Db = dbCts.db 

Đừng quên để thêm máy chủ và giản đồ vào bảng Users tôi đã làm không phải vì không có thông tin như vậy về câu hỏi của bạn.

Ngoài ra, để thực hiện việc này, người dùng được kết nối của bạn phải có đặc quyền trên tất cả các cơ sở dữ liệu.

+2

Tôi không nghĩ rằng yêu cầu này là động, tôi phải thay đổi nó mỗi khi tôi thêm người dùng –

+0

@Hamza_L Nó không phải là động. Và bạn phải thay đổi nó mỗi khi bạn thêm một Cơ sở dữ liệu, cho rằng đây không phải là một nhiệm vụ đơn giản, thêm hai dòng trong truy vấn sẽ không được nhiều. Nhưng nó chỉ là một cách tiếp cận. Vui lòng chọn câu trả lời hay nhất :) –

1

SQL động có thể rất phức tạp.

Ví dụ này tạo truy vấn chọn từ bảng người dùng. Biến @Query được tăng cho mỗi dòng được trả về bởi bảng Người dùng. Mỗi hàng trả về một truy vấn tham gia bảng người dùng cục bộ vào bảng dự án trong một db từ xa. Kết quả của mỗi truy vấn là UNIONED cùng nhau.

Ví dụ

Ví dụ này sử QUOTENAME để giúp tránh SQL injection attacks.

+0

tại sao có u.Id = p.Id? u.Id là id của người dùng và p.id là id của dự án –

+0

Rất tiếc, tôi đã hiểu sai sơ đồ của bạn. Tôi sẽ chỉnh sửa .... –

Các vấn đề liên quan