2016-04-01 1 views
1

Есть ли способ генерации динамического оператора sql, так что значение поля из одной таблицы участвует в соединении таблицы?Динамический SQL с именем таблицы из поля

Вот что я пытаюсь сделать:

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 

Как значение ref.referenced_database_name быть прикреплены к sys.objects?

+0

И ожидаете ли вы, существует ли множество 'referenced_database_name'? – gofr1

ответ

2

Да с небольшим рефакторингом. В исходном примере вы пытались извлечь значение из dm_sql_referenced_entities, прежде чем вы его запросили.

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

Спасибо! Ваш ответ мне очень помог, теперь я получаю общее представление о том, как создавать такие запросы – GAG