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/