我使用条件生成动态SQL语句。此语句涉及使用许多表的多个连接。要求是获取此声明中使用的所有表的列表。
例如:
SELECT
table1.a, table2.b, ...
FROM
table1
INNER JOIN
table2 ON table1.col1 = table2.col1
LEFT OUTER JOIN
table3 ON table2.col3 = table3.col1
我希望动态获取上述查询中使用的表列表,如:
table1,table2,table3.
我正在使用C#和SQL Server。我认为解析字符串并查找单个表将是复杂的。有什么办法可以从SQL Server本身获取查询中使用的表列表吗?
答案 0 :(得分:0)
如果您有足够的权限(例如CREATE/DROP VIEW
,VIEW DEFINITION
),这里有一个可能的解决方案,让SQL Server完成大部分工作,这意味着您不必解析SQL:
扩展动态SQL,使其创建一个(临时)视图,并在其后面显示SELECT
查询:
CREATE VIEW schema.someRandomUniqueName WITH SCHEMABINDING AS
SELECT schema.table1.a, schema.table2.b, ...
FROM schema.table1
INNER JOIN schema.table2 ON a.col1=b.col1
LEFT OUTER JOIN schema.table3 ON schema.table2.col3 = schema.table3.col1;
要注意的一些要点:
WITH SCHEMABINDING
。String.Format("_{0:N}", Guid.NewGuid())
。查询sys.dm_sql_referenced_entities
创建的视图。这将为您提供SELECT
查询所依赖的数据库对象。 (以下示例未经测试:)
SELECT referenced_schema_name, referenced_entity_name, referenced_class_desc
FROM sys.dm_sql_referenced_entities ('schema.someRandomUniqueName', 'OBJECT');
DROP
临时视图;它不再需要了。