2017-08-08 3 views
0

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

+1

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

Antwort

0

Es ist nicht die beste Lösung, aber wenn Sie dies wirklich tun müssen - ein einfacherer Weg besteht darin, ein dynamisches SQL zu verwenden, um die benötigten Daten zuerst in eine globale temporäre Tabelle zu laden. Die dynamische SQL-Anweisung ist viel einfacher, d.h .:

SET @sqlStatement = 'SELECT * INTO ##MyGlobalTemp FROM ' + @FunctionName + '(''' + @RecordId + ''')' 
EXEC sp_executesql @sqlStatement 

Dann regelmäßig nutzen (nicht dynamisch) Cursor auf Schleife durch die ## MyGlobalTemp Tabelle (und vergessen Sie nicht die Temperatur zu fallen, nachdem Sie fertig sind).

d.h .:

DECLARE myCursor CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR SELECT column1, column2, etc.. FROM ##MyGlobalTemp...... etc.. 

Dynamische Cursor könnte haarig. Stellen Sie nur sicher, dass die Temperatur einen globalen (##) Gültigkeitsbereich hat.

Hoffe, das hilft.

Verwandte Themen