使用条件从另一个数据库导入所有视图的 SQL 脚本

Posted

技术标签:

【中文标题】使用条件从另一个数据库导入所有视图的 SQL 脚本【英文标题】:SQL Script to import all views from another database using criteria 【发布时间】:2013-10-30 20:13:56 【问题描述】:

使用 SQL Server 2005。我们有一个主数据库,它会不时创建新视图,有时一天创建几次。

我们有多个具有相同表结构的客户数据库。我会链接以使我们客户的数据库视图与我们的主视图保持同步。

目前,我们使用 management studio 从 master 生成一个 SQL 脚本,其中包含我们所有的视图(它们都以 ! 开头)。然后删除所有以 ! 开头的当前视图在客户的数据库上运行脚本。

我希望能够运行一个脚本,该脚本会删除所有以 ! 开头的视图。并从 master 导入所有以 ! 开头的视图。

我还希望不必在每次创建或更新视图时都生成新脚本。

用 sql 脚本可能无法做到这一点?

*编辑 - 第一部分完成

感谢@Szymon 脚本的初始部分运行良好,不得不对其进行一些修改以适应 sql2005 和其中一些包含空格的视图

declare @sql as nvarchar(max)
set @sql = N''
select @sql = @sql + 'DROP VIEW "' + name + '";' from sys.views where name like '!%'
exec (@sql)

我已经尝试过,但我无法弄清楚第二部分,确保它返回一些(不是全部)带有一些值的视图名称,但我不确定从那里去哪里。

【问题讨论】:

您是否尝试过使用可以与多个数据库通信的外部工具编写脚本? SSIS、Powershell 或 C# 应用程序都可以做到这一点... 嗯,我相信你,但不知道如何实现这样的事情 【参考方案1】:

这绝对是可行的。您可以使用sys 视图来获取所有必要的信息。

例如,如果您想删除数据库sample 中所有以! 开头的视图,您可以使用:

declare @sql as nvarchar(max) = N''
select @sql = @sql + 'DROP VIEW ' + name + ';' from sample.sys.views where name like '!%'
exec (@sql)

以类似的方式,您可以使用以下查询来获取创建视图的信息(这只是一个示例,您可能需要更多列):

select v.name, c.name, t.name, c.max_length, c.is_nullable from sys.views v
inner join sys.columns c on v.object_id = c.object_id
inner join sys.types t on t.system_type_id = c.system_type_id

这不是一个完整的解决方案,但它应该能让你走上正轨。

【讨论】:

感谢您的帮助。放置表部分在稍作改动后效果很好。我现在正在努力解决困难的部分。

以上是关于使用条件从另一个数据库导入所有视图的 SQL 脚本的主要内容,如果未能解决你的问题,请参考以下文章

SQL SERVER2008远程备份数据库到本地

数据库部署之导入的视图数量少于脚本中的视图函数/存储过程导入完毕存在大红叹号问题原因及解决方法

从另一个脚本导入函数

如何将 python 函数从另一个文件导入 django 视图

在 SQL 中检查 IF 条件,即使它不匹配

使用 pyspark 和 when 条件从另一个数据框创建列