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;
これらのいずれかがインデックス付きビューである場合、これはインデックスを作成しないことに注意してください。また、ビューが他のデータベースで実際に作成できるかどうかも検証しません (すべての依存オブジェクトが 2 つの間で同一であることが確実でない限り)。データベース)、および作成の順序は保証されません (ViewA が ViewB を呼び出す場合、正しい順序で作成されない可能性があります)。これを自動化するには、スキーマ比較ツールを使用する方がはるかに優れています。私はこれについてここに書いた:
http://bertrandaaron.wordpress.com/2012/04/20/re-blog-the-cost-of-reinventing-the-wheel/