在整个脚本中保持可变范围

时间:2013-05-14 19:27:40

标签: sql sql-server-2008 variables

我有一个脚本,其中包含许多连接到各种链接服务器的select into语句。

我希望能够多次运行该脚本,但在每种情况下,服务器和数据库都会发生变化,并且会有一些表名称发生变化。

我希望使用变量在beiginning中定义服务器一次,如下所示,但当然它们超出了范围,因为它们只是局部变量。

declare @table_that_changes varchar(100) 
declare @linked_server1 varchar(20)
declare @linked_server2 varchar(20)
declare @DB_onserver1 varchar(100) 
declare @DB_onserver2 varchar(100)
select @linked_server1 = '[server109]',
       @linked_server2 = '[server104]',
       @DB_onserver1 = '[database203434]',
       @DB_onserver2= '[database416541]',
       @table_that_changes = 'LossTable_2191'

存储这些值的最佳方法是什么,所以我可以做(例如)等效的

select * from @linked_server1.@DB_onserver1.dbo.table1

是否适用于包含大量select语句的脚本?

3 个答案:

答案 0 :(得分:0)

不完全是你想要的,但是一种方法是使用动态sql(未测试)来远程服务器对表的脚本进行脚本编写

declare @table_that_changes varchar(100) 
declare @linked_server1 varchar(20)
declare @linked_server2 varchar(20)
declare @DB_onserver1 varchar(100) 
declare @DB_onserver2 varchar(100)
select @linked_server1 = '[server109]',
       @linked_server2 = '[server104]',
       @DB_onserver1 = '[database203434]',
       @DB_onserver2= '[database416541]',
       @table_that_changes = 'LossTable_2191'

declare @sql varchar(1000)

set @sql = 'create view linked1.table1 as select * from ' +
           @linked_server2 + '.' + @DB_onserver1  + '.table1'

exec( @sql)

答案 1 :(得分:0)

虽然您已经接受了另一个答案,但SQLCMD scripting variables旨在完全处理此类任务。

答案 2 :(得分:-1)

除非脚本中有GO,否则变量应保留在整个脚本的范围内。我的猜测是你有一个或多个GO重新启动语句并清除任何指定的变量。