使用SQL Server 2008 R2。我需要编写一个SQL脚本来搜索现有SQL视图中的特定文本(例如服务器名称),将该文本替换为另一个字符串,然后更新视图(ALTER VIEW)。我无法弄清楚如何编写这个脚本。有人做过类似他们可以分享的事吗?
我是否会将整个文本提取到变量中,执行REPLACE,然后"重写"这个变量的整个视图?
我能够改变视图语句,不知道如何最好地刷新视图 @viewtext变量:
declare @viewtext nvarchar(max)
set @viewtext = (select definition from sys.objects so
join sys.sql_modules sm on sm.object_id = so.object_id
where so.type = 'V'
and so.object_id = object_id('dbo.vwHistoryByLocation'))
set @viewtext = (select replace(@viewtext,'.PROD.','.TEST.'))
set @viewtext = (select replace(@viewtext,'CREATE VIEW','ALTER VIEW'))
select @viewtext
不确定是否有更好的方法,但又回到了解决这个问题并按照以下方式开展工作:
declare @rc int = 0
declare @vwtext nvarchar(max)
declare @name nvarchar(max)
declare @descr nvarchar(max)
declare cur cursor for
select so.name, sm.definition from sys.objects so
join sys.sql_modules sm on sm.object_id = so.object_id
where so.type = 'V'
and sm.definition like '%.PROD.%';
open cur;
fetch next from cur into @name, @descr
while (@@FETCH_STATUS = 0)
begin
set @vwtext = (select replace(@descr,'.PROD.','.TEST.'))
set @vwtext = (select replace(@vwtext,'CREATE VIEW ','ALTER VIEW '))
select @vwtext
exec @rc = sys.sp_executesql @vwtext
fetch next from cur into @name, @descr;
end
close cur;
deallocate cur;
答案 0 :(得分:0)
您的视图是否可更新?如果是这样,您可以考虑使用:
UPDATE < view_name > SET<column1>=<value1>,<column2>=<value2>,.....
WHERE <condition>;
如果符合以下条件,视图可以更新:
视图是根据一个且仅有一个表定义的。
视图必须包含基于创建视图的表的PRIMARY KEY。
视图不应包含任何由聚合函数构成的字段。
视图的定义中不得包含任何DISTINCT子句。
视图的定义中不得包含任何GROUP BY或HAVING子句。
视图的定义中不得包含任何SUBQUERIES。
如果要更新的视图基于另一个视图,则后者应该是可更新的。
http://www.w3resource.com/sql/update-views/sql-update-views.php#sthash.J5yJBTS8.dpuf
答案 1 :(得分:0)
我找到了解决方案。我输入的上述描述已经解决了我的问题,实际上我能够将此例程推送到存储过程中,因此我可以传递源文档值和目标文本值以获取需要更新的任何变量。感谢AMA的贡献。