Sql server 有没有办法用tsql脚本替换代码和更新视图
我在一个数据库中有大约20个视图,它们引用了另一个数据库,我们称之为数据库a。我需要一种方法来用脚本更新这些视图,以指向另一个数据库,数据库B。是否有一种方法可以使用单个tsql脚本将视图中数据库a的名称替换为数据库B的名称,并保持视图的完整性?我可以进行替换并将视图输出到查询窗口,但我希望执行生成的ALTER语句,而不必手动运行输出Sql server 有没有办法用tsql脚本替换代码和更新视图,sql-server,tsql,Sql Server,Tsql,我在一个数据库中有大约20个视图,它们引用了另一个数据库,我们称之为数据库a。我需要一种方法来用脚本更新这些视图,以指向另一个数据库,数据库B。是否有一种方法可以使用单个tsql脚本将视图中数据库a的名称替换为数据库B的名称,并保持视图的完整性?我可以进行替换并将视图输出到查询窗口,但我希望执行生成的ALTER语句,而不必手动运行输出 更新我想做的与此类似:但也有由脚本执行的输出。这可能吗?我创建了下面的SQL来做同样的事情。此脚本将接受2个输入 1.旧数据库名称 2.新数据库名 3.要修改的视
更新我想做的与此类似:但也有由脚本执行的输出。这可能吗?我创建了下面的SQL来做同样的事情。此脚本将接受2个输入 1.旧数据库名称 2.新数据库名 3.要修改的视图列表
declare @OldDb varchar(250), @newDB varchar(250)
select @OldDb = '' , ---------->>> provide old db name
@newDB = '' ---------->>> provide new db name
create table #ViewList (Id int identity , ViewName varchar(250))
insert into #ViewList
select TABLE_NAME from INFORMATION_SCHEMA.VIEWS where TABLE_NAME IN ( ) ---------->>> provide you view list
create table #ViewDef( ViewDef nvarchar(max) , ViewName varchar(250) ,Id int )
declare @minId int , @maxid int , @sql nvarchar(max) ='' , @ViewName varchar(250)
select @minId = min(Id) , @maxid = max(id) from #ViewList
while @minId <= @maxid
begin
select @ViewName = ViewName from #ViewList where id = @minId
set @sql = ' insert into #ViewDef (ViewDef)
exec sp_helptext '+ @ViewName +'
update #ViewDef
set ViewName = '''+ @ViewName +''',
id = ' + cast(@minId as varchar(10)) +'
where id is null
update #ViewDef
set ViewDef = replace(ViewDef , '''+ @OldDb+''','''+ @newDB +''')
where id = ' + cast(@minId as varchar(10)) +'
update #ViewDef
set ViewDef = replace(ViewDef , ''create'',''alter'')
where id = ' + cast(@minId as varchar(10)) +'
'
exec sp_executesql @sql
SET @sql = ''
select @sql = @sql + ViewDef from #ViewDef where id = @minId
exec sp_executesql @sql
--print @sql
set @minId = @minId +1
end
**请测试脚本并保存旧定义,以避免在上面的脚本中出现任何错误时发生任何损失。此脚本将接受2个输入 1.旧数据库名称 2.新数据库名 3.要修改的视图列表
declare @OldDb varchar(250), @newDB varchar(250)
select @OldDb = '' , ---------->>> provide old db name
@newDB = '' ---------->>> provide new db name
create table #ViewList (Id int identity , ViewName varchar(250))
insert into #ViewList
select TABLE_NAME from INFORMATION_SCHEMA.VIEWS where TABLE_NAME IN ( ) ---------->>> provide you view list
create table #ViewDef( ViewDef nvarchar(max) , ViewName varchar(250) ,Id int )
declare @minId int , @maxid int , @sql nvarchar(max) ='' , @ViewName varchar(250)
select @minId = min(Id) , @maxid = max(id) from #ViewList
while @minId <= @maxid
begin
select @ViewName = ViewName from #ViewList where id = @minId
set @sql = ' insert into #ViewDef (ViewDef)
exec sp_helptext '+ @ViewName +'
update #ViewDef
set ViewName = '''+ @ViewName +''',
id = ' + cast(@minId as varchar(10)) +'
where id is null
update #ViewDef
set ViewDef = replace(ViewDef , '''+ @OldDb+''','''+ @newDB +''')
where id = ' + cast(@minId as varchar(10)) +'
update #ViewDef
set ViewDef = replace(ViewDef , ''create'',''alter'')
where id = ' + cast(@minId as varchar(10)) +'
'
exec sp_executesql @sql
SET @sql = ''
select @sql = @sql + ViewDef from #ViewDef where id = @minId
exec sp_executesql @sql
--print @sql
set @minId = @minId +1
end
**请测试脚本并保存旧定义,以避免在上述scrip中出现任何错误时丢失。您只需将查询定义放入变量中,然后使用sp_executeSQL执行即可 但是:在没有更多工作的情况下,我会谨慎地使用引用的脚本。 例如,并非所有视图都具有确切的文本“创建视图”。 如果是手写的,例如一些可能是“创建视图”或“创建视图”。 另外,“DB1”可能会让我写“[DB1]” 因此,要么添加更复杂的逻辑,要么在执行之前通过肉眼验证一切
Declare @queryDef nvarchar(max)
SELECT @queryDef = REPLACE (REPLACE (sm.definition, 'CREATE VIEW', 'ALTER VIEW'), 'DB1.', 'DB2.')
FROM sys.sql_modules sm JOIN sys.objects o
ON sm.object_id = o.object_id
WHERE
sm.definition LIKE '%DB1.%' AND o.type = 'V'
print @queryDef
exec sp_executeSql @querydef
您只需要将查询定义放入一个变量中,然后使用sp_executeSQL执行 但是:在没有更多工作的情况下,我会谨慎地使用引用的脚本。 例如,并非所有视图都具有确切的文本“创建视图”。 如果是手写的,例如一些可能是“创建视图”或“创建视图”。 另外,“DB1”可能会让我写“[DB1]” 因此,要么添加更复杂的逻辑,要么在执行之前通过肉眼验证一切
Declare @queryDef nvarchar(max)
SELECT @queryDef = REPLACE (REPLACE (sm.definition, 'CREATE VIEW', 'ALTER VIEW'), 'DB1.', 'DB2.')
FROM sys.sql_modules sm JOIN sys.objects o
ON sm.object_id = o.object_id
WHERE
sm.definition LIKE '%DB1.%' AND o.type = 'V'
print @queryDef
exec sp_executeSql @querydef
使用SimonB idea,我创建了一个自动循环:
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 sp_executeSql @queryDef
END
使用SimonB idea,我创建了一个自动循环:
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 sp_executeSql @queryDef
END
SSMS:右键单击数据库,生成脚本,选择视图,脚本到新窗口,搜索和替换,执行。感谢Alex K。这是我做了很长时间的方式,但我需要一个更快的解决方案。另外,对于多个数据库,这样做很容易出错,因为我可能会更新错误的数据库,例如在运行replace.SSMS后,使用默认值。SSMS:右键单击数据库,生成脚本,选择视图,为新窗口编写脚本,搜索和替换,执行。谢谢Alex K。这是我做了很长时间的方式,但我需要一个更快的解决方案。另外,对于多个数据库,这样做很容易出错,因为我可能会在默认情况下更新错误的数据库,例如在运行replace之后。谢谢我发现的唯一问题是,它似乎一次只更新一个视图,但我可以将其保存为函数,并对搜索返回的所有视图执行它。我还没有发现替换CREATE的任何问题,但很高兴知道。这非常有效。谢谢我发现的唯一问题是,它似乎一次只更新一个视图,但我可以将其保存为函数,并对搜索返回的所有视图执行它。我还没有发现替换CREATE的任何问题,但很高兴知道。