![]() |
1
7
你可以选择不同的方式。首先是SQL Server 2008 支持依赖项 存在于存储过程的包含db的依赖项中(请参见 http://msdn.microsoft.com/en-us/library/bb677214%28v=SQL.100%29.aspx , http://msdn.microsoft.com/en-us/library/ms345449.aspx 和 http://msdn.microsoft.com/en-us/library/cc879246.aspx )您可以使用sys.sql_expression_dependencies和sys.dm_sql_referenced_entities来查看和验证它们。 但对所有存储过程进行验证的最简单方法是:
如果升级db,则不会验证现有存储过程,但如果创建新存储过程,则会验证该过程。因此,在导出和导出所有存储过程之后,您将收到所有报告的现有错误。 还可以使用以下代码查看和导出存储过程的代码
更新的 :要查看存储过程SPmyStoredProcedure引用的对象(如表和视图),可以使用以下方法:
更新2
:在我回答的评论中,马丁·史密斯建议使用
一个接收一个脚本,该脚本可用于验证存储过程依赖性。输出如下(AdventureWorks2008示例):
|
![]() |
2
6
以下是我的工作:
您应该获取所有缺失的SP依赖项,解决后期绑定的问题。
例外
:
学分 Jay's blog 匿名评论员… |
![]() |
3
2
我喜欢使用显示估计执行计划。它可以合理地突出显示许多错误,而不必真正运行过程。 |
![]() |
4
1
我在以前的项目中遇到了同样的问题,并写了一篇 TSQL checker 在sql2005及更高版本上 Windows program 实现相同的功能。 |
![]() |
5
1
当我遇到这个问题时,我很想找到一种安全、无创、快速的技术来验证语法和对象(表、列)引用。 虽然我同意实际执行每个存储过程可能会出现更多的问题,而不仅仅是编译它们,但必须谨慎使用前一种方法。也就是说,您需要知道实际上,执行每个存储过程是安全的(例如,它是否删除了一些表?).这个安全问题可以通过将执行包装在事务中并回滚来解决,这样就不会有永久性的更改,如Devio的回答中所建议的那样。不过,这种方法可能需要相当长的时间,这取决于您操作的数据量。 问题中的代码和Oleg答案的第一部分都建议重新实例化每个存储过程,因为该操作将重新编译该过程并执行此类语法验证。但是这种方法是有侵入性的——对于一个私有的测试系统来说是可以的,但是可能会破坏其他开发人员在一个被大量使用的测试系统上的工作。
我看到了那篇文章
Check Validity of SQL Server Stored Procedures, Views and Functions
,它提供.NET解决方案,但它是
follow-up post
底部的“ddblue”让我更感兴趣。此方法获取每个存储过程的文本,并将
从“create”到“alter”的转换将查找由单个空格分隔的“create”和“proc”。在现实世界中,可能有空格或制表符,也可能有一个或多个。我添加了一个嵌套的“替换”序列(感谢 this article 杰夫·摩登!)将所有此类事件转换为单个空间,允许转换按最初设计的方式进行。然后,由于需要在使用原始“sm.definition”表达式的任何位置使用该表达式,因此我添加了一个通用表表达式,以避免大量、不美观的代码重复。下面是我更新的代码版本:
|
![]() |
6
1
在我第一次提出这个问题的九年后,我刚刚发现了一个由微软自己构建的惊人的工具,它不仅能够可靠地验证SQL Server版本之间的存储过程兼容性,而且还能验证所有其他内部方面。它被重新命名了几次,但他们现在称之为: Microsoft_®数据迁移助手v4.2https://www.microsoft.com/en-us/download/details.aspx?id=53595
以上使用的答案
不管怎样,时代已经改变了,新的工具也出现了——而且是很好的工具——因此,这个答案后来又出现了。 |
![]() |
John D · 需要为NULL或NOT NULL的WHERE子句 4 月前 |
![]() |
Marc Guillot · 记录值时忽略冲突 4 月前 |
![]() |
Fachry Dzaky · 正确使用ROW_NUMBER 5 月前 |
![]() |
TriumphTruth · 从满足特定条件的数据集中选择1行 5 月前 |