0

我想重命名存储过程中使用的表和视图。有没有办法在存储过程中查找和替换表名,也许有用于 ms sql server 的工具(我正在使用 ms sql server 2012)。

4

3 回答 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 回答