gpt4 book ai didi

sql - 列出所有数据库的所有过程中引用的所有列

转载 作者:行者123 更新时间:2023-12-02 21:53:32 25 4
gpt4 key购买 nike

有没有一种方法可以获取实例中所有数据库的所有存储过程中引用的所有列和表?输出应该是:

Database   Procedure   Table   Column 
-------- --------- ----- ------

最佳答案

这将获得您想要的列表,但是如果您在动态 SQL 中嵌入了此类列引用(并且可能找不到依赖于延迟名称解析的引用),那么它不会对您有帮助。 SQL Server 不会解析存储过程的文本以得出 DMV 输出。

现在尝试使用 COLLATE 子句来处理同一服务器上具有不同排序规则的数据库的情况。

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'UNION ALL
SELECT
[database] = ''' + REPLACE(name, '''', '''''') + ''',
[procedure] = QUOTENAME(s.name) + ''.'' + QUOTENAME(p.name)
COLLATE Latin1_General_CI_AI,
[table] = QUOTENAME(referenced_schema_name) + ''.''
+ QUOTENAME(referenced_entity_name)
COLLATE Latin1_General_CI_AI,
[column] = QUOTENAME(referenced_minor_name)
COLLATE Latin1_General_CI_AI
FROM ' + QUOTENAME(name) + '.sys.schemas AS s
INNER JOIN ' + QUOTENAME(name) + '.sys.procedures AS p
ON s.[schema_id] = p.[schema_id]
CROSS APPLY ' + QUOTENAME(name)
+ '.sys.dm_sql_referenced_entities'
+ '(QUOTENAME(s.name) + ''.'' + QUOTENAME(p.name), N''OBJECT'') AS d
WHERE d.referenced_minor_id > 0'
FROM sys.databases
WHERE database_id > 4
AND [state] = 0;

SET @sql = STUFF(@sql,1,11,'');

EXEC sp_executesql @sql;

此外,如果您的数据库处于 80 兼容模式,则 CROSS APPLY 语法将不起作用。只需确保您不在此类数据库中执行代码,它应该可以正常工作(即使某些目标数据库位于 80 中)。

关于sql - 列出所有数据库的所有过程中引用的所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18138464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com