sql - 将 View 复制到另一个数据库

标签 sql sql-server

我有 2 个 SQL Server 数据库 A 和 B,并且想仅使用 SQL 将 View 从数据库 A 复制到数据库 B。 B用作历史数据库,A中的所有表也在B中。

A 中的现有 View 应该以指向 B 中数据的方式复制(重新创建)到 B 中。

使用 SQL Management Studio ( e.g. here ) 很容易解决该任务,但我需要能够使用我自己的程序复制这些 View 。

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

SELECT INTO 或 INSERT INTO 能否解决我的问题?

最佳答案

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;

如果你想创建所有 View ,那么:

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;

如果你希望它是可重复的,你还需要先删除每个 View ,如果它已经存在于目标数据库中。例如:

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;

现在请记住,如果其中任何一个是索引 View ,这将不会创建索引,它也不会验证 View 实际上可以在另一个数据库中创建(除非您确定所有相关对象都是相同的)在两个数据库之间),并且不确保创建顺序(在 ViewA 调用 ViewB 的情况下,它可能不会以正确的顺序创建它们)。使用模式比较工具为您自动执行此操作要好得多。我在这里写道:

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

关于sql - 将 View 复制到另一个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10400907/

相关文章:

mysql - 如何在mysql中解析SQL Server二进制日期格式?

mysql - 使用 Mapping 连接两个表并获得结果

sql-server - 使用 Access 和 SQL Server 高效存储图像

sql - Django:如何正确删除数据库记录以防止主键重用?

java - java.sql.Timestamp(long) 使用哪个时区?

sql - 动态 PIVOT,两表 JOIN 返回结果

mysql - 合并 3 个 SQL 查询的结果?

sql - 我们如何跟踪 SQL Server 中的存储过程更改,就像 TFS 中的版本控制一样

SQL Server - 在跟踪表中有效存储查询结果

mysql - 如何查找两个表中不匹配的计数?