我在Sql Server中有一个数据库。它有很多视图,这些视图引用了其他数据库(同一服务器)。 如何将视图的所有引用更改为其他数据库?我必须逐个做吗?
这是视图的代码: SELECT id,tipo,matricula,descripcion 来自DATABASE1.dbo.t_vehiculo
我想更改参考" DATABASE1"到" DATABASE2"在所有观点中一次。
抱歉我的英文。
提前致谢。
答案 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
我没有测试过代码,所以要小心,先在现场系统上执行自己的测试。