用于更改所有存储过程中所有表引用的SQL脚本

时间:2010-12-06 14:07:10

标签: sql sql-server sql-server-2005

我创建了一个包含现有表副本的新数据库,但更改了这些表的名称,是否有可以运行的sql脚本(可能使用SysObjects)来更改所有存储过程中对这些表的所有引用?

感谢。

5 个答案:

答案 0 :(得分:4)

请勿依赖INFORMATION_SCHEMA.ROUTINES ,因为ROUTINE_DEFINITION仅为nvarchar(4000)。您需要sys.sql_modules其中definition是nvarchar(max)

尝试其中任何一个来找到您需要修改的过程:

SELECT DISTINCT
    LEFT(s.name+'.'+o.name, 100) AS Object_Name,o.type_desc --, m.definition
    FROM sys.sql_modules        m
        INNER JOIN sys.objects  o ON m.object_id=o.object_id
        INNER JOIN sys.schemas  s ON o.schema_id=s.schema_id
    WHERE m.definition Like '%'+@SearchValue+'%'
    ORDER BY 1

SELECT
    OBJECT_SCHEMA_NAME(m.object_id)+'.'+OBJECT_NAME(m.object_id) --, m.definition
    FROM sys.sql_modules  m
    WHERE m.definition like '%whatever%'

SELECT
    OBJECT_SCHEMA_NAME(m.object_id)+'.'+OBJECT_NAME(m.object_id), o.type_desc
        --,m.definition
    FROM sys.sql_modules        m
        INNER JOIN sys.objects  o ON m.object_id=o.object_id
    WHERE m.definition like '%whatever%'

您可以取消注释m.definition以列出内容,但我发现最好只识别所有过程然后手动查看它们,因为您不希望在系统表上运行UPDATE命令。编写必要的程序,进行更改(搜索/替换或手动),然后运行脚本!!!

答案 1 :(得分:3)

没有

我相信Redgate的SQL Refactor具有此功能。否则,您可以编写所有对象的脚本,手动或通过代码进行搜索和替换。

SQL Server 2005也支持可能有所帮助的同义词。

答案 2 :(得分:3)

这是一块SQL,您可以使用它来检索与特定搜索条件匹配的存储过程的定义。您可以简单地将其更改为像Martin建议的那样进行搜索和替换。

只需将'%TABLE_NAME%'更改为您的搜索条件或您要更改的表名。

希望这有帮助。

SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%TABLE_NAME%' AND ROUTINE_TYPE='PROCEDURE'

答案 3 :(得分:1)

如果是短期的(如测试数据库),更简单的解决方案可能是使用旧名称为您更改的每个表创建VIEW。例如,如果您将表tests更改为tests_new,则可以执行以下操作:

CREATE VIEW dbo.tests
AS
SELECT * FROM dbo.tests_new

参考dbo.tests的所有程序都会实际查看dbo.tests_new中的数据。

这是一个非常糟糕的主意,如果这将是一个永久/生产数据库,因为它只会为您的结构添加一层混淆,并使其成为维护的噩梦。

答案 4 :(得分:1)

您无法通过系统数据字典更改sprocs中的表引用 - 您必须获取创建存储过程的脚本并更改脚本中的表名。如果您有脚本,这是一个简单的搜索,并且大部分都是替换。

如果您没有脚本,则可以从sys.sql_modules获取存储过程脚本的文本,或通过SSMS检索它。