Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找对一个数据库的引用';s列在所有其他数据库中_Sql_Sql Server - Fatal编程技术网

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]