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

Posted

技术标签:

【中文标题】如何更新视图中的文本然后更新脚本中的视图?【英文标题】:How can I update text within view then update view in script? 【发布时间】:2014-12-05 16:23:54 【问题描述】:

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

【问题讨论】:

不确定是否有更好的方法,但回到这个并让它按如下方式工作: 【参考方案1】:

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

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

如果满足这些条件,则可以更新视图:

    视图是基于一个且只有一个表定义的。

    视图必须包含创建视图所基于的表的主键。

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

    视图的定义中不得有任何 DISTINCT 子句。

    视图的定义中不得有任何 GROUP BY 或 HAVING 子句。

    视图的定义中不得有任何 SUBQUERIES。

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

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

【讨论】:

我不知道它可能找到的包含搜索文本的每个视图的具体属性。一旦我在@viewtext 变量中获得了完整的视图文本,并将语句中的“CREATE VIEW”文本替换为“ALTER VIEW”,我希望运行一个存储过程将更新的文本推送到视图定义。 【参考方案2】:

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

【讨论】:

以上是关于如何更新视图中的文本然后更新脚本中的视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何将流生成器中的数据显示到文本字段中并更新来自列表视图?

如何更新存档和表格视图单元格

更新列表视图中的单行以显示隐藏的文本视图

容器视图中的 UI 未更新

如何更新列表视图中的记录以及android中的数据库

从主活动更新不同布局 xml 中的文本视图