2016-04-01 29 views
1

Dinamik sql ifadesi oluşturmanın bir yolu var mıdır, böylece bir tablodaki alan değeri bir tablo adında birleştirilir. İşte Dinamik SQL SQL alanından tablo adı

ben yapmaya çalışıyorum ne:
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 

nasıl ref.referenced_database_name değeri sys.objects eklenebilir olabilir?

+0

Çok fazla 'reference_database_name' varsa, bekler misiniz? – gofr1

cevap

2

Evet, biraz refactoring ile. Orijinal örneğinizde, sorgulamadan önce dm_sql_referenced_entities'dan bir değer çıkarmaya çalışıyorsunuz.

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

Teşekkürler! Cevabınız bana çok yardımcı oldu, şimdi bu tür sorguların nasıl oluşturulacağına dair genel fikre sahibim – GAG