2

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

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

使用 SQL Management Studio(例如此处)很容易解决该任务,但我需要能够使用我自己的程序复制这些视图。

生成 CREATE VIEW 语句所需的信息存储在哪里?

SELECT INTO 或 INSERT INTO 能否为我的问题提供解决方案?

4

4 回答 4

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;

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

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;

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

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;

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

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

于 2012-05-01T16:58:39.400 回答
1

Aaron Bertrand 的回答一如既往地棒极了。但是为了完整起见,Red Gate 的SQL 比较可以很好地做到这一点,并且SMO提供了一些功能,例如脚本类,这使得这相对简单。

于 2012-05-01T17:25:37.627 回答
0

这至少适用于 SQL2005 及更高版本,不确定早期版本。

SELECT definition
FROM sys.sql_modules
WHERE object_id = OBJECT_ID('<schema_name.object_name>')

您不能使用 SELECT INTO 或 INSERT INTO 因为视图不是表并且本身不包含任何数据。

于 2012-05-01T16:42:59.250 回答
0

从您的目标数据库(databaseB)执行此操作:

DECLARE @sql NVARCHAR(MAX)
SELECT  @sql = OBJECT_DEFINITION(OBJECT_ID)
FROM    [databaseA].sys.views
WHERE   name = 'View_1'
EXEC (@sql)
于 2012-05-01T16:43:32.787 回答