如何获取存储过程中的表列表

use*_*431 23 sql-server

db中有很多表和sp.我找到了特定sp(存储过程)中使用的表名.

sp_depends %sp_name%没有给出欲望的结果.我也用过INFORMATION_SCHEMA.TABLES,INFORMATION_SCHEMA.ROUTINES桌子.

但结果并没有完全满足我的要求.

Nul*_*ify 15

;WITH stored_procedures AS (
SELECT 
o.name AS proc_name, oo.name AS table_name,
ROW_NUMBER() OVER(partition by o.name,oo.name ORDER BY o.name,oo.name) AS row
FROM sysdepends d 
INNER JOIN sysobjects o ON o.id=d.id
INNER JOIN sysobjects oo ON oo.id=d.depid
WHERE o.xtype = 'P')
SELECT proc_name, table_name FROM stored_procedures
WHERE row = 1
ORDER BY proc_name,table_name
Run Code Online (Sandbox Code Playgroud)

  • 从SQL Server**2005**开始,它建议使用更集中的系统目录视图 - 比如`sys.tables`和`sys.procedures`而不是"通用"`sys.objects`(和`sysobjects`不管怎样都被弃用了) (5认同)
  • @marc_s,同意了!我添加了一个使用更新表的[answer](http://stackoverflow.com/a/23698250/1366033). (2认同)

Dev*_*art 15

尝试更优雅的方式(但是,它的解决方案仅适用于MS SQL 2008或更高版本) -

SELECT DISTINCT 
      [object_name] = SCHEMA_NAME(o.[schema_id]) + '.' + o.name
    , o.type_desc
FROM sys.dm_sql_referenced_entities ('dbo.usp_test1', 'OBJECT') d
JOIN sys.objects o ON d.referenced_id = o.[object_id]
WHERE o.[type] IN ('U', 'V')
Run Code Online (Sandbox Code Playgroud)

  • 更好的方法! (2认同)

Kyl*_*Mit 13

两个最高投票的答案使用了许多应该避免的弃用表.
这是一个更清洁的方法.

获取存储过程所依赖的所有表:

SELECT DISTINCT p.name AS proc_name, t.name AS table_name
FROM sys.sql_dependencies d 
INNER JOIN sys.procedures p ON p.object_id = d.object_id
INNER JOIN sys.tables     t ON t.object_id = d.referenced_major_id
ORDER BY proc_name, table_name
Run Code Online (Sandbox Code Playgroud)

适用于MS SQL SERVER 2005+

变更清单:


Har*_*aid 9

这是sql代码

获取存储过程中使用的表的列表

;WITH stored_procedures AS (
SELECT 
o.name AS proc_name, oo.name AS table_name,
ROW_NUMBER() OVER(partition by o.name,oo.name ORDER BY o.name,oo.name) AS row
FROM sysdepends d 
INNER JOIN sysobjects o ON o.id=d.id
INNER JOIN sysobjects oo ON oo.id=d.depid
WHERE o.xtype = 'P')
SELECT proc_name, table_name FROM stored_procedures
WHERE row = 1
ORDER BY proc_name,table_name
Run Code Online (Sandbox Code Playgroud)

.

反向 - 查找与数据库中的表相关的存储过程 - 在所有存储过程中搜索

有两种方法

----Option 1
SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

----Option 2
SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'
Run Code Online (Sandbox Code Playgroud)

PS:sp_helpsp_depends并不总是返回准确的结果.

参考:

  1. Sql Server Central - 获取存储过程中使用的表的列表
  2. SqlAuthority - 查找与数据库中的表相关的存储过程 - 在所有存储过程中搜索


Jac*_*rch 6

KyleMit 的回答是使用一个很快就会被弃用的表格。建议使用 sys.sql_experssion_dependencies 而不是 sys.sql_dependencies,例如,

SELECT DISTINCT p.name AS proc_name, t.name AS table_name
FROM sys.sql_expression_dependencies d
INNER JOIN sys.procedures p ON p.object_id = d.referencing_id
INNER JOIN sys.tables t     ON t.object_id = d.referenced_id
ORDER BY proc_name, table_name
Run Code Online (Sandbox Code Playgroud)

这应该适用于 SQL Server 2008+。

我没有足够高的声誉来直接评论引用的答案。


dya*_*nko 5

看起来 OP 问题没有完整的答案。上面的大多数答案既没有架构名称,也没有包含存储过程中使用的其他对象(例如函数)。

存储过程中使用的表/视图的完整列表,带有模式名称和对象 ID

SELECT  DISTINCT
        procObj.[object_id]     AS [ProcObjectId],
        procSchema.[name]       AS [ProcSchema],
        procObj.[Name]          AS [ProcName], 
        tableObj.[object_id]    AS [TableObjectId],
        tableSchema.[name]      AS [TableSchema],
        tableObj.[Name]         AS [TableName]
FROM sys.sql_dependencies AS dep
INNER JOIN sys.objects AS procObj
ON procObj.[object_id] = dep.[object_id]
INNER JOIN sys.schemas AS procSchema 
ON procSchema.[schema_id] = procObj.[schema_id]
INNER JOIN sys.objects AS tableObj
ON tableObj.[object_id] = dep.[referenced_major_id]
INNER JOIN sys.schemas AS tableSchema 
ON tableSchema.[schema_id] = tableObj.[schema_id]
WHERE   procObj.[type] = 'P' 
    -- using this filter we can control dependent object types
    -- e.g. tableObj.[type] IN ('U') - returns tables only
    AND tableObj.[type] IN ('V', 'U')
Run Code Online (Sandbox Code Playgroud)

请注意,有一个可以更改的依赖对象类型的过滤器(取决于您想要的输出结果)。类型缩写的完整列表在 这里