【问题标题】:Programmatically copy Database Views from one Database Server to another以编程方式将数据库视图从一个数据库服务器复制到另一个
【发布时间】:2018-01-23 09:05:59
【问题描述】:

我有两个数据库服务器(我们称它们为“外部”和“内部”),我想从“外部”服务器检索视图并将它们存储在“内部”服务器上。 “内部”服务器是一个 MS SQL-Server,我不太了解另一个,但我认为它也是 MS SQL。现在,我需要每天将“外部”服务器上的视图映射到我的数据库结构中。所以我想每天抓取一次视图,然后与它们一起工作。

我已阅读this post,但我不能说我如何以编程方式复制视图。 MS SQL Server 中是否有一个选项可以从另一台服务器复制视图或类似的东西?

【问题讨论】:

  • 如果另一台服务器是 MS SQL Server,只需查询其通过视图过滤的 sys.sql_modules,但如果是另一台 RDBMS,则不会有 sql_modules

标签: sql-server database


【解决方案1】:

您可以使用以下查询来获取所有视图的定义-

1) 首次创建视图 -

 select  t1.definition  , N'
 Go
 ' 
 from sys.sql_modules  t1
 join INFORMATION_SCHEMA.TABLES  t2
 on object_name(t1.object_id) = t2.TABLE_NAME and TABLE_TYPE = 'VIEW'

2) 查询以每天更改视图 -

 select   replace( t1.definition , 'create view ','alter view ')  , N'
 Go
 ' 
 from sys.sql_modules  t1
 join INFORMATION_SCHEMA.TABLES  t2
 on object_name(t1.object_id) = t2.TABLE_NAME and TABLE_TYPE = 'VIEW

在源服务器上运行上述查询将输出转换为文本并在目标服务器上执行。确保您将结果转换为文本,并且 SSMS 的“每列中的最大字符显示”设置为 8000(在 SSMS 顶部菜单中转到 Query-> Query Option ->Results->text )。

【讨论】:

  • 只是为了让我理解代码: 1) 将视图作为文本获取,通过将其加入所有现有表来从 sys.sql_modules 中选择所有视图? 2)老实说,我不太确定这是做什么的。你能进一步解释这一点吗?已经感谢您的回答!
  • sql_modules 包含所有对象的定义,如视图、SP、触发器、用户定义的函数等。为了过滤掉视图定义,我们将其与 INFORMATION_SCHEMA.TABLES 连接。此表包含数据库中用户定义的表和视图的列表。所以查询“TABLE_TYPE = 'VIEW'”中的最后一个条件将确保我们只采用视图的定义。
【解决方案2】:

只是为了补充拉胡尔的回应:

select   replace( t1.definition , 'create view ','create or alter view ')  , N'
Go
' 
from sys.sql_modules  t1
join INFORMATION_SCHEMA.TABLES  t2
on object_name(t1.object_id) = t2.TABLE_NAME and TABLE_TYPE = 'VIEW'

无论是第一次还是后续运行,都要执行一条语句。

【讨论】:

    猜你喜欢
    • 2011-09-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2023-03-15
    相关资源
    最近更新 更多