Sql 查找对一个数据库的引用';s列在所有其他数据库中
当服务器上任何数据库中的存储过程引用特定数据库中的一列时(假设数据库为Sql 查找对一个数据库的引用';s列在所有其他数据库中,sql,sql-server,Sql,Sql Server,当服务器上任何数据库中的存储过程引用特定数据库中的一列时(假设数据库为AA),我希望将这5列作为输出 其中四列非常容易获取-对于您所在的当前数据库: SELECT TableName = t.Name, SchemaName = s.Name, ColumnName = c.Name, DatabaseName = DB_NAME() FROM sys.tables t INNER JOIN sys.schemas s ON [t].[schem
AA
),我希望将这5列作为输出
其中四列非常容易获取-对于您所在的当前数据库:
SELECT
TableName = t.Name,
SchemaName = s.Name,
ColumnName = c.Name,
DatabaseName = DB_NAME()
FROM
sys.tables t
INNER JOIN
sys.schemas s ON [t].[schema_id] = [s].[schema_id]
INNER JOIN
sys.columns c ON [t].[object_id] = [c].[object_id]
您无法轻松获得的是所有数据库中所有表的所有列。另外:确定每列在哪个过程中使用也是相当棘手的(或者几乎不可能)。从
marc\u s
answer我生成一个查询,该查询给出了该表所依赖的逗号分隔的过程名称
SELECT
TableName = t.Name,
SchemaName = s.Name,
ColumnName = c.Name,
DatabaseName = DB_NAME(),
STUFF((SELECT ',' + name
FROM sys.procedures
WHERE object_id in (SELECT distinct id from sys.sysdepends
WHERE depid = (SELECT object_id FROM sys.tables
WHERE name=t.Name)
)
FOR XML PATH('')), 1, 0, '') AS sps
FROM
sys.tables t
INNER JOIN
sys.schemas s ON [t].[schema_id] = [s].[schema_id]
INNER JOIN
sys.columns c ON [t].[object_id] = [c].[object_id]
谢谢你的快速回复。我需要所有数据库的所有过程中使用的特定数据库中所有列的信息。可能吗?假设在特定的db'AA'和特定的过程'PP'中使用了列'CC',我需要输出CC PP AA。@marc_S我们可以用
sys.sysdepends
table做些什么吗?@user2666339:正如我所说的-不,获取信息(哪个过程中使用了哪个列)一点也不容易。您几乎必须加载所有过程的T-SQL代码并对其进行解析…@Nithesh:这只会告诉您过程依赖于哪些表(或视图等)-它不会进入列级别…@marc_s我根据您的答案生成了一个查询,该查询给出了逗号分隔的sp名称字符串(取决于表)。请看一看,并评论PLS与上述查询,我得到的只是在数据库中使用的程序列表(需要验证,虽然有一些信息)。是否有一种方法可以获取所有数据库的所有SP中的所有信息。谢谢。它返回特定表中的所有列,就好像所有列都被使用一样,即使存储过程中只使用了少数列。我认为这不能精确地完成,至少因为动态SQL可以在存储过程中使用。还因为您可以在其他数据库中定义同义词,并且您的列引用可能会使用复杂的名称/表别名,如database..table AS t
或database..[table]作为t1
-现在你必须解析所有代码,以引用任何t.column
或t1.column
,并希望它们是前缀(它们并不总是因为人们懒惰)。是的,你们是对的。我是否可以在所有过程中使用表,因为它们将以[schema].[table_name]格式使用,我将手动检查这些过程中的列以列出它们。
SELECT
TableName = t.Name,
SchemaName = s.Name,
ColumnName = c.Name,
DatabaseName = DB_NAME(),
STUFF((SELECT ',' + name
FROM sys.procedures
WHERE object_id in (SELECT distinct id from sys.sysdepends
WHERE depid = (SELECT object_id FROM sys.tables
WHERE name=t.Name)
)
FOR XML PATH('')), 1, 0, '') AS sps
FROM
sys.tables t
INNER JOIN
sys.schemas s ON [t].[schema_id] = [s].[schema_id]
INNER JOIN
sys.columns c ON [t].[object_id] = [c].[object_id]