Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在整个脚本中保持变量作用域_Sql_Sql Server 2008_Variables - Fatal编程技术网

Sql 在整个脚本中保持变量作用域

Sql 在整个脚本中保持变量作用域,sql,sql-server-2008,variables,Sql,Sql Server 2008,Variables,我有一个脚本,其中包含许多select into语句,这些语句连接到各种链接的服务器 我希望能够多次运行脚本,但在每种情况下,服务器和数据库都会发生变化,一些表名也会发生变化 我希望在开始的时候使用变量来定义服务器,比如下面的内容,但当然它们超出了范围,因为它们只是局部变量 declare @table_that_changes varchar(100) declare @linked_server1 varchar(20) declare @linked_server2 varchar(20

我有一个脚本,其中包含许多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语句的脚本中都有效?

除非脚本中有GO,否则变量应在整个脚本中保持在作用域内。我猜您有一个或多个GO,它重新启动语句并清除任何指定的变量

这并不完全是您想要的,但是一种方法是使用动态sql从远程服务器上为表上的视图编写脚本,方法如下(未测试)


虽然你已经接受了另一个答案,就是用来处理这类任务的。

看这个:在我看来,你知道你所期望的方式是不可能的。你要用数据库之类的变量来处理。我认为最好将你的信息作为全局变量存储在表中。你必须用动态SQL来处理所有事情,这将使脚本的可读性大大降低—T-SQL是一种简单的语言,它需要数据库名称,但需要名称,而不是字符串(也不是变量),这并不能真正回答问题。Op想做一些没有动态SQL无法完成的事情,与
GO
s无关
select * from @linked_server1.@DB_onserver1.dbo.table1
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)