当前位置: 首页 > 面试题库 >

如何获取存储过程中引用的所有列的列表?

欧阳安晏
2023-03-14
问题内容

我有许多使用CTE,临时表,表变量和子查询的存储过程,我需要获取该存储过程中使用的所有列(包括数据库,架构和表/视图)的列表。我不需要获取临时表,表变量或CTE中的列。我只需要在服务器上的数据库的表或视图中定义的引用列。

我试过了sys.dm_sql_referenced_entitiessys.sql_expression_dependencies但是在第一个选择查询后或在CTE中选择后,它们不返回列。


问题答案:

当执行存储过程时,它将被解析并编译成查询计划,将对其进行缓存,您可以通过sys.dm_exec_cached_plans和sys.dm_exec_query_plan以XML格式对其进行访问。查询计划记录已解析代码的每个部分的“输出列表”。查看存储过程使用了哪些列,只是查询此XML的问题,就像这样:

--Execute the stored procedure to put its query plan in the cache
exec sys.sp_columns ''

DECLARE @TargetObject nvarchar(100) = 'sys.sp_columns';

WITH XMLNAMESPACES (
    'http://schemas.microsoft.com/sqlserver/2004/07/showplan' as ns1
), CompiledPlan AS (
    SELECT 
        (SELECT query_plan FROM sys.dm_exec_query_plan(cp.plan_handle)) qp,
        (SELECT ObjectID FROM sys.dm_exec_sql_text(cp.plan_handle)) ob
    FROM sys.dm_exec_cached_plans cp
    WHERE objtype = 'Proc'
), ColumnReferences AS (
    SELECT DISTINCT
        ob,
        p.query('.').value('./ns1:ColumnReference[1]/@Database', 'sysname') AS [Database],
        p.query('.').value('./ns1:ColumnReference[1]/@Schema', 'sysname') AS [Schema],
        p.query('.').value('./ns1:ColumnReference[1]/@Table', 'sysname') AS [Table],
        p.query('.').value('./ns1:ColumnReference[1]/@Column', 'sysname') AS [Column]
    FROM CompiledPlan
        CROSS APPLY qp.nodes('//ns1:ColumnReference') t(p)
)

SELECT 
    [Database], 
    [Schema], 
    [Table], 
    [Column]
FROM ColumnReferences 
WHERE 
    [Database] IS NOT NULL AND 
    ob = OBJECT_ID(@TargetObject, 'P')

请注意, 这取决于您如何定义“已使用”。您的存储过程中的CTE可能引用了表中的5列,但是当使用此CTE时,仅传递了三列。查询优化可能会
忽略这些额外的字段,并且不将它们包括在计划中。另一方面,优化器可以通过在输出中包括额外的字段来决定它可以进行更有效的查询,以便以后可以使用更好的索引。此代码将返回查询计划使用的列,它们可能不完全是存储过程代码中的列。



 类似资料:
  • 问题内容: 我正在寻找一种方法来列出在Informix上运行的数据库中的所有存储过程。 数据库中是否有表格列出存储过程以及有关存储过程的详细信息? 问题答案: 就在这里。叫做。尝试此操作以查看所有内容:

  • 问题内容: 有没有一种方法可以获取实例中所有数据库中所有存储过程中引用的所有列和表?输出应为: 问题答案: 这将得到您想要的列表,但是,如果您在动态SQL中嵌入了此类列引用(并且可能找不到依赖于延迟名称解析的引用),则将无济于事。SQL Server不会解析存储过程的文本以提供DMV输出。 现在尝试使用子句来处理在同一服务器上具有不同归类的数据库的情况。 如果您的数据库处于80兼容模式,那么该语法

  • 问题内容: 如何获得Python中索引名称的列表?这是我到目前为止的内容: 问题答案: 搜索有关使用库进行检索的信息时,会出现此问题。接受的答案说可以使用,但该方法已删除(截至2017年)。要获取,您可以使用以下代码:

  • 问题内容: 是否有一种快速的方法可以从中的所有表获取所有列名,而不必列出所有表? 问题答案:

  • 本文向大家介绍Microsoft SQL Server 检索所有存储过程的列表,包括了Microsoft SQL Server 检索所有存储过程的列表的使用技巧和注意事项,需要的朋友参考一下 示例 下面的查询将返回数据库中的所有存储过程的列表,以及关于每个存储过程的基本信息: SQL Server 2005 的ROUTINE_NAME,ROUTINE_SCHEMA和ROUTINE_DEFINITI

  • 我正在上传图片,一切工作都很好,但我有100张图片,我想在我的中显示所有的图片,当我在一个文件夹中获得图片的完整列表时,我找不到任何API。