更改视图中对其他数据库的所有引用

时间:2015-10-28 15:47:00

标签: sql-server

我在Sql Server中有一个数据库。它有很多视图,这些视图引用了其他数据库(同一服务器)。 如何将视图的所有引用更改为其他数据库?我必须逐个做吗?

这是视图的代码: SELECT id,tipo,matricula,descripcion 来自DATABASE1.dbo.t_vehiculo

我想更改参考" DATABASE1"到" DATABASE2"在所有观点中一次。

抱歉我的英文。

提前致谢。

2 个答案:

答案 0 :(得分:0)

如果您没有提前做好准备,那么您最有可能选择逐个进行手动编辑。唯一的"批量"可用选项是使用SSMS将所有视图编写为一个文件/查询会话的脚本,然后对数据库名称进行搜索和替换。不幸的是,根据数据库名称和View代码,这可能非常冒险。

我所做的是在同义词中定义我的所有数据库外引用。然后我写了我的观点,以便他们只引用同义词,而不是直接引用外部数据库。现在,如果外部数据库发生变化,我可以使用一个简单的自动程序一次更改所有的同义词。

答案 1 :(得分:0)

如果您有一个唯一的数据库名称(与您视图中的任何其他文本不同),您可以这样做。

DECLARE     @ObjectName     nvarchar(128)
DECLARE     @ViewCode       nvarchar(max)
DECLARE     @Sql            nvarchar(max)

DECLARE     CurView 
CURSOR FOR  SELECT      OBJECT_NAME(object_id),  REPLACE(COM.text, 'DATABASE1.dbo.', 'DATABASE2.dbo.')
            FROM        sys.views           AS VWS
            INNER JOIN  sys.syscomments     AS COM
                ON      COM.id              = VWS.object_id
            WHERE       COM.text            LIKE '%DATABASE1.dbo.%'

OPEN CurView

FETCH NEXT  FROM    CurView
            INTO    @ObjectName, @ViewCode
WHILE       @@FETCH_STATUS = 0
BEGIN
            SET         @Sql = 'DROP VIEW ' + QUOTENAME(@ObjectName)
            EXEC        (@Sql) 
            EXEC        (@ViewCode)
            FETCH NEXT  FROM    CurView
                        INTO    @ObjectName, @ViewCode
END

CLOSE CurView
DEALLOCATE CurView

我没有测试过代码,所以要小心,先在现场系统上执行自己的测试。