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包含名称),因此我无法在数据库名称中编写脚本,也无法运行第二个脚本。

4

2 回答 2

5

基于@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)
于 2013-03-14T17:21:16.947 回答
3

要在与您所在的数据库不同的数据库中执行动态 SQL 语句,您可以像这样使用 sp_executesql:

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

这将导致返回 db2。

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

于 2013-03-14T17:05:01.683 回答