2

似乎有几个使用 sp_rename 重命名的存储过程,导致 syscomments 保留旧的 proc 名称而不是新的 proc 名称。

因此,我的数据库传输无法正确传输。

有没有办法找到哪些 proc(或任何对象)的名称不同步?

或者更好的是,找到并修复它们的简单方法?

4

1 回答 1

3

你可以试试

select object_name(id)
from syscomments 
WHERE COLID=1 AND
OBJECTPROPERTY(id, 'isprocedure')=1 and
REPLACE(REPLACE(TEXT,CHAR(13),' '),CHAR(10),' ') 
          NOT LIKE '%CREATE%PROC%'+ object_name(id) + ' %'
AND
(REPLACE(REPLACE(TEXT,CHAR(13),' '),CHAR(10),' ')
          NOT LIKE '%CREATE%PROC%'+ object_name(id) + ']%')

SYS.SQL_MODULES如果您在位之前有大约 4,000 个字符的评论,可能会稍微更健壮CREATE PROC

一个比自己解析文本更强大的解决方案是生成一个脚本来运行以重新编译所有存储过程。如果您运行以下...

SELECT 'EXEC sp_refreshsqlmodule ''' + 
            quotename(schema_name(schema_id)) + '.' + 
            quotename(object_name(object_id)) + '''' 
FROM sys.procedures

...然后将结果复制并粘贴到管理工作室查询窗口中并执行生成的脚本,如果名称不同步,它会给您一个错误。

这将导致您的所有存储过程计划被重新编译,因此如果这是一个问题,请不要在生产服务器上执行此操作。

编辑以提供有关错误的附加信息。

sp_rename如果有任何可能用于交换两个对象的定义,则不应使用上述答案中的代码。sp_refreshsqlmodule 显然在这种情况下有一个错误!

于 2010-07-28T22:03:02.927 回答