我们如何从Microsoft SQL服务器检索所有存储过程及其依赖表在数据库中不存在?
我只是解释一下......
我有一个包含数百个表和存储过程的数据库。在开发时间的意思是我只是添加更多的表并删除一些以前的表格形式的数据库,但存储过程依赖于此表不是。结果是,当我生成上述数据库的脚本并尝试将其恢复到另一个数据库时,由于没有表格,它会产生错误。
答案 0 :(得分:1)
以下查询可以为您提供所需信息。
SELECT OBJECT_NAME(sed.referencing_id) AS referencing_entity_name,
sed.referenced_entity_name
FROM sys.objects AS o
INNER JOIN sys.sql_expression_dependencies AS sed ON sed.referencing_id = o.object_id
WHERE o.type = 'P'
and not exists (select 1 from INFORMATION_SCHEMA.COLUMNS
where table_name = referenced_entity_name)
and referenced_id is null
它使用sys.objects查找存储过程并连接到sys.sql_expression_dependencies以查找这些SP的依赖关系。然后,它根据表中是否存在INFORMATION_SCHEMA.COLUMNS来过滤依赖项。
有关查找依赖关系的更多信息,请访问MSDN - http://msdn.microsoft.com/en-us/library/ms345404%28v=sql.120%29.aspx。
请注意,sys.sql_expression_dependencies
仅存在于SQL Server 2008及更高版本中。您没有说明您使用的是哪个版本,但如果您使用的是2005,则需要使用sys.sql_dependencies
代替sys.sql_expression_dependencies
。不幸的是,由于列不同,它不是直接交换,但在MSDN上可以找到更多信息 - http://msdn.microsoft.com/en-us/library/ms174402%28v=SQL.90%29.aspx
答案 1 :(得分:0)
亲爱的,你没有提到你的sqlserver版本。
但你可以通过2个查询来实现
-- first query to get all procedure name
SELECT routine_name, routine_type FROM INFORMATION_SCHEMA.ROUTINES where ROUTINE_TYPE = 'PROCEDURE' order by ROUTINE_NAME asc
--you can loop of above and pass the each procedure name to this second query. If zero return , then no dependency
SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class_desc, is_caller_dependent
FROM sys.dm_sql_referencing_entities ('dbname.procedureName', 'OBJECT');
http://www.mssqltips.com/sqlservertip/1294/listing-sql-server-object-dependencies/
http://msdn.microsoft.com/en-IN/library/ms345404.aspx
Stored procedure dependencies in SQL Server Management Studio