SQL Server curseur imbriqué problème
J'ai un problème étrange avec mon curseurs imbriqués et je n'ai aucune idée de quoi il s'agit.
Voici mon code T-SQL:
declare @dbname varchar(50)
declare @servername varchar(50)
declare srv cursor for select servername from test.dbo.servers
declare @str varchar(200)
truncate table test.dbo.temp
open srv
fetch next from srv into @servername
while @@fetch_status = 0
begin
set @str = 'Data Source='+@servername+';Integrated Security=SSPI'
declare db cursor for select name from opendatasource('SQLNCLI', @str).master.dbo.sysdatabases
open db
fetch next from db into @dbname
while @@fetch_status = 0
begin
insert test.dbo.temp (dbname, servername) values (@dbname, @servername)
fetch next from db into @dbname
end
fetch next from srv into @servername
close db
deallocate db
end
close srv
deallocate srv
Il me donne le message d'erreur suivant:
Syntaxe incorrecte près de '@str'.
[SQLSTATE 42000] (Erreur 102)
Dirait que le problème est dans le don de la variable comme paramètre à la fonction opendatasource. Mais pourquoi? Et comment éviter ce problème?
- curseur imbriqué : c'est votre problème là!!
- Je pense qu'un curseur imbriqué est le seul moyen viable de faire ce que l'OP veut faire (en boucle par toutes les bases de données en un ensemble de serveurs, dont les noms sont contenus dans un tableau)
Vous devez vous connecter pour publier un commentaire.
Il est exact que les variables ne peuvent pas être passés à
OPENDATASOURCE
. Au lieu de cela, Vous devez utiliser un littéral à la place. Autant que nous déconseillons l'aide de SQL dynamique, il y a certains cas qu'il est inévitable. Essayez quelque chose comme ceci:Si vous devez utiliser des curseurs imbriqués, vous faites quelque chose de mal. Il y a très peu de raisons d'utiliser un curseur au lieu d'un ensemble de base de fonctionnement, et à l'aide d'un curseur à l'intérieur d'un curseur, c'est comme l'ultime SQL Server anti-modèle.
Pour l'intérieur de votre curseur, vous pouvez le changer pour utiliser le sans-papiers
sp_msforeachdb
fonction (qui, apparemment, crée un curseur en coulisses):Vous pouvez avoir besoin de joindre l' ? dans des guillemets simples et leur échapper, comme:
EXEC sp_msforeachdb 'insert test.dbo.temp (dbname, servername) values (''?'', @Servername)
sp_msforeachdb
alors? (Il utilise un curseur!)sp_msforeachdb
, mais je ne suis pas sûr de savoir comment cela rend les connexions aux serveurs distants.