我想重命名存储过程中使用的表和视图。有没有办法在存储过程中查找和替换表名,也许有用于 ms sql server 的工具(我正在使用 ms sql server 2012)。
问问题
5477 次
3 回答
3
即使将“允许更新”选项设置为 1,SQL Server 也可能不允许您直接更新系统目录中存在的对象定义(在您的情况下为视图和存储过程)。
以下代码将生成所需的 ALTER 脚本,您可以在查看定义 ([ModifiedDefinition] ) 后手动运行它们,或者您可以遍历 [ModifiedDefinition] 的每个值并使用sp_executesql运行它。
SELECT
b.Name AS [ObjectName],
CASE WHEN b.type ='p' THEN 'Stored Procedure'
WHEN b.type ='v' THEN 'View'
ELSE b.TYPE
END AS [ObjectType]
,a.definition AS [Definition]
,Replace ((REPLACE(definition,'OLD Value','New Value')),'Create','ALTER') AS [ModifiedDefinition]
FROM sys.sql_modules a
JOIN
( select type, name,object_id
from sys.objects
where type in (
'p' -- procedures
,'v'--views
)
and is_ms_shipped = 0
)b
ON a.object_id=b.object_id
和往常一样,在对对象定义执行批量更改之前,请注意生产数据并进行备份!
于 2013-05-28T12:45:59.233 回答
2
您可以使用DBvisualizer .. 它几乎适用于所有数据库,也适用于 ms sql,您可以使用它来完成您提到的所有操作。
于 2013-05-28T11:33:04.647 回答
0
我在另一个主题( https://stackoverflow.com/a/67728039/11165834 )上回答了这个问题,我使用以下脚本进行操作:
DECLARE @queryDef NVARCHAR(max)
WHILE EXISTS (
SELECT 1
FROM sys.sql_modules sm
JOIN sys.objects o ON sm.object_id = o.object_id
WHERE sm.definition LIKE '%TEXT_TO_REPLACE%'
AND o.type = 'V'
)
BEGIN
-- TO ALTER THE VIEW AUTOMATICALLY
SET @queryDef = ( SELECT TOP 1 Replace (Replace (sm.definition, 'CREATE VIEW', 'ALTER VIEW'),
'TEXT_TO_REPLACE',
'NEW_TEXT')
FROM sys.sql_modules sm
JOIN sys.objects o ON sm.object_id = o.object_id
WHERE sm.definition LIKE '%TEXT_TO_REPLACE%'
AND o.type = 'V')
EXEC (@queryDef)
END
当我将备份从生产恢复到测试数据库时,我用它来替换过程/视图。
正如@SA 所说,要非常小心,因为这不是一种非常安全的方式。根据您的需要更改“o.type”和“替换(sm.definition,'CREATE VIEW','ALTER VIEW'”
于 2021-06-10T21:12:29.543 回答