来自字段的动态 SQL 具有 table 名称
Dynamic SQL with table name from a field
有没有一种方法可以生成动态 sql 语句,以便来自一个 table 的字段值参与要连接的 table 名称?
这是我正在尝试做的事情:
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?
是的,稍作重构。在您的原始示例中,您试图在 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);
有没有一种方法可以生成动态 sql 语句,以便来自一个 table 的字段值参与要连接的 table 名称?
这是我正在尝试做的事情:
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?
是的,稍作重构。在您的原始示例中,您试图在 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);