Cay*_*ian 3 t-sql sql-server-2008-r2
我们正在运行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)
Run Code Online (Sandbox Code Playgroud)
但是您无法传递DB的名称来创建视图.
所以我尝试了这个:
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)
Run Code Online (Sandbox Code Playgroud)
但它现在抱怨GO语句(语法不正确).
为存档数据创建的数据库的名称是在脚本中动态确定的(@archdb包含名称),因此我无法在数据库名称中编写脚本,因此无法运行第二个脚本.
根据@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)
Run Code Online (Sandbox Code Playgroud)