0

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

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

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

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

在包含大量选择语句的脚本中有效?

4

3 回答 3

0

尽管您已经接受了另一个答案,但SQLCMD 脚本变量旨在处理此类任务。

于 2013-05-15T20:16:25.790 回答
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)
于 2013-05-15T06:43:39.360 回答
-1

除非您的脚本中有 GO,否则变量应在整个脚本中保持在范围内。我的猜测是您有 1 个或多个 GO,它们会重新启动语句并清除任何分配的变量。

于 2013-05-14T19:41:16.973 回答