存储过程MSSQL2005

时间:2008-11-15 11:56:00

标签: sql-server sql-server-2005 stored-procedures

如果您有很多存储过程并且更改了表的列的名称,是否有办法检查哪些存储过程不再起作用?


更新:我已经阅读了一些答案,我很清楚,没有简单的方法可以做到这一点。离开存储过程会更容易吗?

5 个答案:

答案 0 :(得分:4)

我是SysComments的忠实粉丝:

SELECT DISTINCT Object_Name(ID) 
FROM SysComments 
WHERE text LIKE '%Table%'
AND text LIKE '%Column%'

答案 1 :(得分:3)

对此有一种书本式的答案,以及现实世界的答案。

首先,对于书籍答案,您可以使用sp_depends查看其他存储过程引用该表(而不是单个列),然后检查它们以查看它们是否引用该表:

http://msdn.microsoft.com/en-us/library/ms189487.aspx

然而,现实世界的答案是它在很多情况下都不起作用:

  • 动态SQL字符串:如果您在存储过程或应用程序代码中动态构建字符串,然后执行该字符串,SQL Server无法知道您的代码在做什么。您的代码中可能会对列名进行硬编码,而且会破坏。
  • 嵌入式T-SQL代码:如果您的应用程序中有代码(而不是SQL Server中),那么SQL Server端的任何内容都不会检测到它。

另一种选择是使用SQL Server Profiler捕获服务器上所有活动的跟踪,然后在捕获的查询中搜索所需的字段名称。在生产服务器上这不是一个好主意,因为配置文件会产生一些开销,但它确实有效 - 大部分时间都是如此。如果您的应用程序执行“SELECT *”,然后在您的应用程序中,您希望特定的字段名称作为该结果集的一部分返回。

你可能已经开始认识到没有简单,直接的方法来做到这一点。

答案 2 :(得分:2)

虽然这将花费最多的工作,但确保一切正常的最佳方法是编写集成测试

集成测试就像单元测试一样,除非在这种情况下它们将与数据库集成。这需要一些努力,但您可以轻松编写运行每个存储过程的测试,以确保它执行无错误。

在最简单的情况下,它只会执行sp并确保没有错误,并且不关心实际结果。如果你的测试刚刚执行了sp没有检查结果,你可以写出很多这样的通用。

要执行此操作,您需要执行数据库。虽然您可以手动设置数据库并部署存储过程,但最好的方法是使用持续集成从源控制系统自动获取最新代码(数据库DDL,存储过程,测试),构建数据库并执行试验。每次提交源代码管理更改时都会发生这种情况。

是的,似乎做了很多工作。这是很多工作,但收益也很大。确保您的更改不会破坏任何内容的能力使您能够以更高的质量更快地推进产品。

查看NUnitNDbUnit

答案 3 :(得分:0)

我确信有更优雅的方法可以解决这个问题,但如果数据库不是太复杂,那么这是一种快速而又肮脏的方式:

选择所有sprocs和脚本到查询窗口。

搜索旧列名称。

答案 4 :(得分:0)

如果您只想在存储过程中查找列使用情况,那么最好的方法是在定义列sys.sql_modules表中强制搜索列名 - 它存储存储过程的定义/功能。