Ich versuche eine dynamische Abfrage zu verwenden, um einen Cursor zu deklarieren. Grundsätzlich habe ich den Namen der Tabellenwert-Funktion, die ich für den Cursor als Spalte einer Tabelle verwenden werde, also muss ich den Cursor mit einer SQL-Anweisung deklarieren.Wie deklariere ich einen Cursor in T-SQL dynamisch?
Das Problem ist, dass T-SQL myCursor
nicht als gültigen Cursor erkennt.
DECLARE @ColumnA nvarchar(250)
DECLARE @ColumnB nvarchar(250)
DECLARE @FunctionName nvarchar(250)
DECLARE @RecordId nvarchar(250)
DECLARE @sqlStatement nvarchar(MAX)
SET @sqlStatement = 'DECLARE myCursor CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR SELECT * FROM ' + @FunctionName + '(''' + @RecordId + ''')'
EXEC sp_executesql @sqlStatement
OPEN myCursor
FETCH NEXT FROM myCursor INTO @ColumnA, @ColumnB
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @ColumnA, @ColumnB
FETCH NEXT FROM myCursor INTO @ColumnA, @ColumnB
END
CLOSE myCursor
DEALLOCATE myCursor
Jede Hilfe oder Workarounds sind willkommen.
BEARBEITEN: Ich habe das Problem gelöst, indem ich den Cursor vorher deklarierte und Ausgabe von sqlstatement verwendete, um Werte zu übergeben.
DECLARE- @myCursor CURSOR
SET @sqlStatement 'SET CURSOR @myCursor = LOCAL STATIC READ_ONLY FORWARD_ONLY FOR SELECT * FROM' = + @FunctionName + '(' '' + @RecordId + '' '); OPEN @myCursor; '
EXEC Sp_executesql @sqlStatement, N '@ Platzhalter nvarchar (250), @Placeholdervalue nvarchar (250), @myCursor CURSOR OUTPUT', @Placeholder = @Placeholder, @Placeholdervalue = @Placeholdervalue, @myCursor = @myCursor OUTPUT
Das klingt wie ein [xy Problem] (https://meta.stackexchange.com/q/66377/179361). Was versuchst du eigentlich zu erreichen? Ich kann mir nicht vorstellen, dass dies die beste Lösung ist. In 10 Jahren Arbeit mit SQL Server kann ich ehrlich sagen, dass ich noch nie ein Szenario gefunden habe, das einen dynamisch deklarierten Cursor erfordern würde. Woher weißt du, dass deine Funktion mindestens zwei Spalten zurückgibt? Woher wissen Sie, dass diese Spalten 'nvarchar (250)' sind? Woher wissen Sie, dass ein gültiger Funktionsname vergeben wurde? Woher wissen Sie, dass Ihre Funktion einen einzelnen nvarchar (250) -Parameter akzeptiert? – GarethD