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

问题描述 投票:3回答:5

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

sql sql-server sql-server-2005
5个回答
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以列出内容,但是我发现最好对所有过程进行ID,然后手动进行检查,因为您不想在系统表上运行UPDATE命令。编写必要的程序脚本,进行更改(搜索/替换或手动进行),然后运行脚本!!


3
投票

编号

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

SQL Server 2005还支持同义词,可能会有帮助。


3
投票

这里是一堆SQL,您可以用来检索符合特定搜索条件的存储过程的定义。您可以简单地将其更改为进行搜索并像马丁建议的那样替换。

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

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

1
投票

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

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

您所有引用dbo.tests的程序实际上将查看dbo.tests_new中的数据。

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.