SQL Server geschachtelte cursor problem
Ich habe ein seltsames problem mit meinem geschachtelte Cursorn und ich habe keine Ahnung, was es überhaupt geht.
Hier mein T-SQL-code:
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
Es gibt mir die nächste Fehlermeldung:
Falsche syntax in der Nähe '@str'.
[SQLSTATE 42000] (Fehler 102)
Sieht aus wie das problem, indem Sie die variable als parameter zu opendatasource-Funktion. Aber warum? Und wie dieses problem zu vermeiden?
geschachtelte cursor : das ist dein problem genau dort!!
Ich denke, dass eine geschachtelte cursor ist der einzige gangbare Weg, das zu tun, was der OP will do (Schleife über alle Datenbanken in eine Sammlung von Servern, die Namen, die enthalten sind in einer Tabelle)
Ich denke, dass eine geschachtelte cursor ist der einzige gangbare Weg, das zu tun, was der OP will do (Schleife über alle Datenbanken in eine Sammlung von Servern, die Namen, die enthalten sind in einer Tabelle)
InformationsquelleAutor stee1rat | 2010-12-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie richtig, Variablen können nicht übergeben werden, zu
OPENDATASOURCE
. Stattdessen müssen Sie ein literal statt. So viel wie wir raten von der Verwendung von dynamischem SQL, es gibt einige Fälle, dass es unvermeidlich ist. Probieren Sie etwas wie dieses:Sie sind sehr herzlich willkommen!
InformationsquelleAutor Phil Hunt
Wenn Sie müssen, verwenden Sie geschachtelte Cursor, machst du etwas falsch. Es gibt nur sehr wenige Gründe, um einen cursor, verwenden, anstatt einige andere set-basierten Betrieb, und mit einem cursor in einen cursor ist wie die ultimative SQL Server-anti-pattern.
Für Ihre innere cursor, Sie könnte es ändern, verwenden Sie die undokumentierte
sp_msforeachdb
Funktion (was offenbar wird ein cursor hinter den kulissen):Müssen Sie möglicherweise schließen Sie den ? in single-quotes und entkommen, wie:
EXEC sp_msforeachdb 'insert test.dbo.temp (dbname, servername) values (''?'', @Servername)
sp_msforeachdb
dann? (Es verwendet einen cursor!)lol ich wusste nicht, wie es intern betrieben. Danke für die info.
Ich glaube, dass es ein argument für den Einsatz ist es allerdings noch immer (+1). Es nimmt etwas von der Komplexität der Ops-code und hat einige zusätzliche Prüfungen, die Datenbank zugänglich ist.
Ich mag, dass Sie verwenden
sp_msforeachdb
, aber ich bin mir nicht sicher, wie Sie dies macht die verbindungen zu den remote-Servern.Guter Punkt, den ich fälschlicherweise, dass Links. Oben berichtigt.
InformationsquelleAutor JNK