我们正在运行Server 2008 R2并创建一个归档函数,该函数将创建一个新数据库(稍后可以脱机并存储在其他地方),然后将数据从主数据库中取出并放入新数据库,最后在主数据库中创建一个视图来查看新表中的归档数据。
我有创建DB的脚本,在新DB中创建归档表,从主DB复制记录并将它们放到归档DB中,并从主DB中删除记录。现在,我正在尝试编写一个视图的创建脚本:
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包含名称),因此我不能在DB名称中编写脚本,也不能运行第二个脚本。
发布于 2013-03-14 17:21:16
基于@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-14 17:05:01
要在与您所在的数据库不同的数据库中执行动态SQL语句,可以使用如下所示的sp_executesql:
USE db1;
EXEC db2.sys.sp_executesql N'SELECT DB_NAME();';这将导致返回db2。
GO不是T语句.SSMS解释它将查询文本分解为批处理。它永远不会发送到Server本身。
https://stackoverflow.com/questions/15415044
复制相似问题