2013-05-14 6 views
0

J'ai un script qui contient plusieurs instructions select into qui se connectent à divers serveurs liés. Je veux être capable d'exécuter le script plusieurs fois mais dans chaque cas, les serveurs et les bases de données vont changer et quelques noms de tables changeront. J'espérais utiliser des variables pour définir les serveurs une fois à la fin avec quelque chose comme ce qui suit, mais bien sûr ils sortent de la portée car ils ne sont que des variables locales.Conserver la portée variable dans un script

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' 

Quelle est la meilleure façon de conserver ces valeurs pour que je puisse faire le equivilant de (par exemple)

select * from @[email protected]_onserver1.dbo.table1 

qui fonctionne à travers un script qui contient beaucoup d'instructions select?

+0

Regardez ceci: ["Variables globales" dans SQL Server] (http://weblogs.sqlteam.com/mladenp/archive/2007/04/23/60185.aspx) – Fuad

+0

Vous savez dans mon idée comment vous êtes attendre n'est pas possible.vous allez vous comporter avec une variable comme une base de données ou quelque chose comme ça. Je pense qu'il est préférable de stocker vos informations dans un tableau en tant que variables globales. – Fuad

+0

Vous devrez tout faire en SQL dynamique, ce qui rendra les scripts moins lisibles - T-SQL est un langage simple, et où il attend un nom de base de données, il attend un * nom *, pas un * string * (ni, à son tour, une variable) –

Répondre

0

Pas exactement ce que vous voulez, mais une approche serait de vues de script sur les tables des serveurs distants à l'aide sql dynamique le long des lignes de (non testé)

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) 
+0

Cool, cela fonctionne merci, mais j'ai du mal à lire mon code! – simon77

-1

Sauf s'il y a un GO dans votre script, les variables doivent rester dans la portée tout au long du script. Ma conjecture est que vous avez 1 GO ou plus qui redémarre les déclarations et efface toutes les variables attribuées.

+1

Cela ne répond pas vraiment à la question. Op veut faire quelque chose qui ne peut pas être fait sans SQL dynamique, rien à voir avec 'GO's – Lamak