如何在视图中更新文本然后在脚本中更新视图?

时间:2014-12-05 16:23:55

标签: sql view sql-server-2008-r2 sql-scripts

使用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;

2 个答案:

答案 0 :(得分:0)

您的视图是否可更新?如果是这样,您可以考虑使用:

UPDATE < view_name > SET<column1>=<value1>,<column2>=<value2>,.....
WHERE <condition>;

如果符合以下条件,视图可以更新:

  1. 视图是根据一个且仅有一个表定义的。

  2. 视图必须包含基于创建视图的表的PRIMARY KEY。

  3. 视图不应包含任何由聚合函数构成的字段。

  4. 视图的定义中不得包含任何DISTINCT子句。

  5. 视图的定义中不得包含任何GROUP BY或HAVING子句。

  6. 视图的定义中不得包含任何SUBQUERIES。

  7. 如果要更新的视图基于另一个视图,则后者应该是可更新的。

  8. http://www.w3resource.com/sql/update-views/sql-update-views.php#sthash.J5yJBTS8.dpuf

答案 1 :(得分:0)

我找到了解决方案。我输入的上述描述已经解决了我的问题,实际上我能够将此例程推送到存储过程中,因此我可以传递源文档值和目标文本值以获取需要更新的任何变量。感谢AMA的贡献。