2016-04-01 7 views
1

Gibt es eine Möglichkeit, dynamische SQL-Anweisung zu generieren, so dass der Feldwert aus einer Tabelle an einem Tabellenname teilnimmt, der verbunden wird? HierDynamisches SQL mit Tabellenname aus einem Feld

ist, was ich versuche zu tun:

DECLARE @sql NVARCHAR(MAX) = N'' 
DECLARE @MainProc NVARCHAR(MAX) = N'dbo.MainProc' 

SET @sql += N'SELECT ref.* 
FROM sys.dm_sql_referenced_entities (' + @MainProc + N', ''OBJECT'') AS ref 
INNER JOIN ' + ref.referenced_database_name + '.sys.objects AS o ON ref.referenced_id = o.object_id AND o.type = ''P'' 
WHERE ref.referenced_schema_name NOT IN (''system'')' 

EXEC sp_executesql @sql 

Wie kann der Wert von ref.referenced_database_name zu sys.objects angebracht werden?

+0

Und würden Sie erwarten, wenn es viele 'referenzierte_Datenbank_Name's gibt? – gofr1

Antwort

2

Ja mit ein wenig Refactoring. In Ihrem ursprünglichen Beispiel haben Sie versucht, einen Wert von dm_sql_referenced_entities zu extrahieren, bevor Sie ihn abgefragt haben.

DECLARE @sql  NVARCHAR(MAX) = N'' 
DECLARE @MainProc NVARCHAR(MAX) = N'Fact.Account_Load' 

/* Builds the sys.Objects query. 
* Can return multiple queries. 
*/ 
SELECT  
    @sql += 
    ' 
     SELECT 
      s.* 
     FROM 
      ' + QUOTENAME(ref.referenced_database_name) + '.sys.objects AS s 
     WHERE 
      s.Object_Id = ' + CAST(ref.referenced_id AS VARCHAR(255)) + ' 
      AND s.Type = ''P'' 
     ; 
    ' 
FROM 
    sys.dm_sql_referenced_entities('Fact.Account_Load', 'OBJECT') AS ref 
WHERE 
    ref.referenced_database_name IS NOT NULL 
GROUP BY 
    ref.referenced_database_name, 
    ref.referenced_id 
; 

-- Executes dynamic query. 
EXECUTE(@sql); 
+0

Danke! Ihre Antwort hat mir sehr geholfen, jetzt bekomme ich die allgemeine Idee, solche Anfragen zu konstruieren – GAG