2016-03-04 23 views
5

Mam tabeli Users,dynamiczny SQL osadzony w kwerendy wybierającej

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

i wiele baz danych, które mają taką samą strukturę (tak samo stoły, te same procedury, ...), więc każda baza danych mamy tabelę o nazwie Project i to jest struktura Project tabeli

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

Więc kiedy kwerendy bazy danych:

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

uzyskać ten wynik:

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

Teraz, co ja chcę, to „link”/„join” ... wynika z tabeli Users do tego zapytania, gdzie kolumna Db w tabeli jest Users nazwa mojej bazy danych, więc mogę uzyskać wynik podobny do tego:

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

Próbuję z dynamicznym SQL, ale bez powodzenia.

UWAGA: Każdy użytkownik ma tylko jedną bazę danych, a baza należeć tylko do jednego użytkownika, to jest jeden do jednego relacji

+1

Czy istnieje jakiś związek między tabela żądań i tabela użytkowników inna niż na specyfikacji baza danych ific? A jeśli nie, czy istnieje więcej niż jeden użytkownik na bazę danych, a jeśli tak, jakie byłyby wyniki? –

+0

proszę określić relacje w tabeli i sposób, w jaki oczekujesz zgłoszeń, jako 2,3,6 – TheGameiswar

+0

Db jest jedynym łączem, a każdy użytkownik ma tylko jedną bazę danych, a baza danych należy do tylko jednego użytkownika. –

Odpowiedz

1

Łącząc te 2 odpowiedzi https://stackoverflow.com/a/35795690/1460399 i https://stackoverflow.com/a/35795189/1460399, mam tego rozwiązania:

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

drodze można zrobić to z UNII licząc każdą konkretną tabelę bazy danych i nadając jej identyfikację dla bazy danych, na przykład:

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 

nie zapomnij dodać serwer i schematu do Users tabeli i nie dlatego, że nie ma takiej informacji na swoim pytaniu.

Również w tym celu połączony użytkownik musi mieć uprawnienia do wszystkich baz danych.

+2

Nie sądzę że żądanie to jest dynamiczne, muszę to zmienić za każdym razem, gdy dodaję użytkownika. –

+0

@Hamza_L To nie jest dynamiczne. I musisz to zmienić za każdym razem, gdy dodajesz Bazę Danych, ponieważ nie jest to proste zadanie, a dodanie dwóch wierszy w zapytaniu nie byłoby tak wiele. Ale to tylko jedno podejście. Zapraszam do wybrania najlepszej odpowiedzi :) –

1

Dynamiczny SQL może być bardzo trudny.

Ten przykład tworzy zapytanie wyboru z tabeli użytkowników. Zmienna @Query jest inkrementowana dla każdej linii zwróconej przez tabelę Użytkownicy. Każdy wiersz zwraca zapytanie, które łączy tabelę użytkowników lokalnych z tabelą projektów w zdalnej bazie danych. Wyniki każdego zapytania są razem: UNIONED.

Przykład

tym przykładzie użyto QUOTENAME aby uniknąć SQL injection attacks.

+0

dlaczego tam jest u.Id = p.Id? u.ID jest identyfikatorem użytkownika, a p.id jest identyfikatorem projektu. –

+0

Przepraszam, że źle zrozumiałem twój schemat. Zrobię edycję .... –

Powiązane problemy