获取SQL语句中使用的所有表的名称

时间:2014-09-16 06:37:42

标签: c# sql sql-server sql-server-2008

我使用条件生成动态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本身获取查询中使用的表列表吗?

1 个答案:

答案 0 :(得分:0)

如果您有足够的权限(例如CREATE/DROP VIEWVIEW DEFINITION),这里有一个可能的解决方案,让SQL Server完成大部分工作,这意味着您不必解析SQL:

  1. 扩展动态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())
  2. 查询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');
    
  3. DROP临时视图;它不再需要了。