2013-03-14 97 views
3

我们正在运行SQL Server 2008 R2和创造,这将创建一个新的数据库(以后可以脱机并存储在别处)的存档功能,然后拿数据出来我们的主数据库,并把它进入新的数据库,最后,在主数据库中创建一个视图来查看新表中的存档数据。创建视图

我的脚本来创建数据库,创建新数据库的归档表,从主数据库复制的记录,并把它们到归档数据库,并从主数据库中删除记录。现在我正在尝试创建视图的脚本:

declare @sql varchar(8000) 
set @sql = 'create view [' + @srcdb + '].[dbo].[vw_artrans] as 
      select * from [' + @srcdb + '].[dbo].artrans 
      union 
      select * from [' + @archdb + '].[dbo].artrans' 
exec (@sql) 

但是,您无法传递数据库的名称来创建视图。

所以,我想这个代替:

declare @sql varchar(8000) 
set @sql = 'use ' + @srcdb + ' 
      go 
      create view [vw_artrans] as 
      select * from [' + @srcdb + '].[dbo].artrans 
      union 
      select * from [' + @archdb + '].[dbo].artrans' 
exec (@sql) 

但现在抱怨GO语句(不正确的语法)。

为存档数据创建的数据库的名称是在脚本中动态确定的(@archdb包含名称),所以我无法在数据库名称中编写脚本,也无法运行第二个脚本。

+0

正如一个侧面评论,你真的需要一个'UNION',意味着你需要从工会得到不同的行?它比'UNION ALL'慢得多,它只是结合了两个输出。你声明*“然后将数据从我们的主数据库中取出并放入新的数据库”*,这让我认为你想要'UNION ALL'。 – 2013-03-14 17:36:15

+0

@DominicGoulet:你是正确的......我忘了,当我在样本SQL打字的ALL。 – Caynadian 2013-03-15 15:36:43

+0

@MichaelFredrickson:我需要有一个GO命令,因为CREATE VIEW将无法正常工作,除非它在脚本中的第一个语句。 – Caynadian 2013-03-15 15:37:31

回答

4

基于@Sebastien答案,这里是解决方案:

declare @sql varchar(8000) 

set @sql = 'EXEC ' + @srcdb + '.sys.sp_executesql N''create view [vw_artrans] as 
      select * from [' + @srcdb + '].[dbo].artrans 
      union 
      select * from [' + @archdb + '].[dbo].artrans'';' 

exec (@sql) 
+0

感谢的上下文中运行!这正是我要找的。 – Caynadian 2013-03-15 15:41:58

3

在不同的数据库比一个你在你可以使用sp_executesql的这样执行动态SQL语句:返回

USE db1; 
EXEC db2.sys.sp_executesql N'SELECT DB_NAME();'; 

这WIL结果在DB2中。

GO不是T-SQL语句。它被SSMS解释为将查询文本分成批次。它永远不会发送到SQL Server本身。

+0

我将您的解决方案扩展到@Caynadian可以使用的解决方案。 – 2013-03-14 17:34:05

+0

+1我是莫名其妙不知道完全限定'sp_executesql'将使其在限定的数据库... – 2013-03-14 18:02:00