循环遍历数据库列表以删除和重新创建视图
Posted
技术标签:
【中文标题】循环遍历数据库列表以删除和重新创建视图【英文标题】:Looping through list of database to drop and recreate a view 【发布时间】:2012-01-06 15:38:29 【问题描述】:我不确定是否可以使用 TSQL 中的循环来执行此操作。
我有一个数据库列表,我想循环遍历每个数据库,并根据需要重新创建视图。
我已经有一个脚本可以删除并重新创建视图。然而,目前在我的脚本顶部,我有一堆使用语句,我只是在列表中取消注释并重新运行脚本。但是我想自动化它,所以它会快得多。过去我做过类似的事情,通过一串数据库名称循环并使用它来执行 use 语句。除了创建视图时,它有效,因为视图必须由 go 语句分隔。这是我用于解析数据库的代码的代码 sn-p 任何有助于使用视图的帮助都会很棒。
DECLARE @DBs AS VARCHAR(MAX);
DECLARE @OneDB AS VARCHAR(255);
DECLARE @CmdToExec AS VARCHAR(MAX);
SET @DBs = 'db1,db2,db3,db4,db5,db6,db7,db8,db9,db10,db11,db12,db13,db14,db15,db16'
DECLARE DB_Cursor CURSOR FOR
SELECT SUBSTRING( ',' + @DBs + ',', n + 1,
CHARINDEX( ',', ',' + @DBs + ',', n + 1 ) - n - 1 ) AS "dbInfo"
FROM CommunityPAL.dbo.Numbers
WHERE SUBSTRING( ',' + @DBs + ',', n, 1 ) = ','
AND n < LEN( ',' + @DBs + ',' );
OPEN DB_Cursor;
FETCH NEXT FROM DB_Cursor INTO @OneDB;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @CmdToExec = 'USE ' + @OneDB;
EXEC @CmdToExec;
--statements to execute
FETCH NEXT FROM DB_Cursor INTO @OneDB;
END
CLOSE DB_Cursor
DEALLOCATE DB_Cursor
【问题讨论】:
"有一个我想循环访问的数据库列表,并为每个数据库删除并根据需要重新创建视图。" - 为什么? 需要将新字段添加到每个视图我有一个使用来自不同客户端数据库的视图的 Web 应用程序 【参考方案1】:我很确定您不能只在 T-SQL 中做您想做的事情。 CREATE VIEW
(和ALTER VIEW
)不使用三部分命名约定(database.schema.object)。它必须是批处理中的唯一语句,因此它不能与动态 SQL 调用(EXEC
或 sp_executeSQL
)中的 USE
命令组合,并且该 USE
的效果只会持续到该批次的持续时间(即直到任何嵌入的GO
)。
但是,我在“外部”SQL Server 中完成了类似的工作,更新了特定“类型”的所有数据库中的特定对象(我们每个客户/客户都有一个)。它变得复杂。简要概述:
使用您选择的脚本(或编程)语言 遍历数据库列表 为每个数据库执行一次 SQLCMD,然后执行您的[RE]CREATE VIEW
脚本
【讨论】:
对于子范围也持续存在。EXEC ('USE tempdb; EXEC(''CREATE VIEW foo AS SELECT 1 AS X'')')
哦,嵌套动态 SQL。让你在我身后,撒旦! (虽然它可能会工作......)【参考方案2】:
请检查sp_msforeachdb
过程以循环所有数据库:
Take advantage of undocumented SQL Server iteration procedures
【讨论】:
您仍然有“CREATE VIEW 可以是批处理中唯一的语句”的问题,这是相关的,因为他需要代码来确定是否要在 this 数据库(即IF ''?'' like [list of DBs]
之类的语法以上是关于循环遍历数据库列表以删除和重新创建视图的主要内容,如果未能解决你的问题,请参考以下文章
从现有 json 列表中提取唯一值以创建唯一的列表视图构建器