将视图复制到另一个数据库

a13*_*37q 2 sql sql-server

我有2个SQL Server的atabases A和B,并希望从数据库中的一个视图复制到仅使用SQL数据库B.B用作历史数据库,A中的所有表也在B中.

来自A的现有视图应该以指向B中的数据的方式复制(重新创建)到B中.

使用SQL Management Studio(例如此处)可以轻松解决该任务,但我需要能够使用自己的程序复制这些视图.

存储生成CREATE VIEW语句的必要信息在哪里?

SELECT INTO或INSERT INTO可以为我的问题提供解决方案吗?

Aar*_*and 9

USE DatabaseA;
GO

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = definition
FROM sys.sql_modules
WHERE [object_id] = OBJECT_ID('dbo.ViewName');

EXEC DatabaseB..sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)

如果要创建所有视图,则:

USE DatabaseA;
GO

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'';

SELECT @sql = @sql + CHAR(13) + CHAR(10) + 'GO'
    + CHAR(13) + CHAR(10) + m.definition
FROM sys.sql_modules AS s
INNER JOIN sys.objects AS o
ON s.[object_id] = o.[object_id]
WHERE o.type_desc = 'VIEW';

EXEC DatabaseB..sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)

如果希望这是可重复的,则还需要先删除每个视图(如果它已存在于目标数据库中).例如:

USE DatabaseA;
GO

DECLARE @sql NVARCHAR(MAX);

SET @sql = N'';

SELECT @sql = @sql + CHAR(13) + CHAR(10) + 'IF OBJECT_ID('''
    + QUOTENAME(SCHEMA_NAME(o.[schema_id]))
    + '.' + QUOTENAME(o.name) + ''') IS NOT NULL
      BEGIN
        DROP VIEW ' 
        + QUOTENAME(SCHEMA_NAME(o.[schema_id]))
        + '.' + QUOTENAME(o.name) + ';
      END'
    + CHAR(13) + CHAR(10) + 'GO'
    + CHAR(13) + CHAR(10) + s.definition
FROM sys.sql_modules AS s
INNER JOIN sys.objects AS o
ON s.[object_id] = o.[object_id]
WHERE o.type_desc = 'VIEW';

EXEC DatabaseB..sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)

现在请记住,如果其中任何一个是索引视图,这将不会创建索引,它也不会验证视图是否可以在其他数据库中实际创建(除非您肯定所有依赖对象在两者之间是相同的)数据库),并不确保创建顺序(在ViewA调用ViewB的情况下,它可能无法以正确的顺序创建它们).使用模式比较工具为您自动执行此操作会更好.我在这里写到了这个:

http://bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/