Como declarar dinamicamente um cursor em T-SQL?

estou a tentar usar uma consulta dinâmica para declarar um cursor. Basicamente eu tenho o nome da função de valor de tabela que eu vou usar para o cursor como uma coluna de uma tabela assim que eu devo declarar o cursor usando uma instrução SQL.

o problema é que T-SQL não reconhece myCursor como um cursor válido.

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
Qualquer ajuda ou Trabalho são bem-vindos.

editar: resolvi o problema declarando o cursor antes e usando o resultado do sqlstatement para passar valores.

DECLARE @myCursor CURSOR

SET @sqlStatement = 'SET @myCursor = CURSOR local STATIC READ_ONLY FORWARD_ONLY FOR SELECT * FROM' + @FunctionName + ' ("'+ @Record +"'); OPEN @myCursor; '

EXEC sp_executesql @sqlStatement, N'@Placeholder nvarchar(250), @Placeholdervalue nvarchar (250), @myCursor CURSOR OUTPUT', @Placeholder = @Placeholder, @Placeholdervalue = @Mycursor = @myCursor OUTPUT

Author: user2095829, 2017-08-08

1 answers

Não é a melhor solução, mas se você realmente tem que fazer isso - uma maneira mais fácil é usar um SQL dinâmico para carregar os dados de que você precisa em uma tabela temporária global em primeiro lugar. A declaração SQL dinâmica é muito mais simples, ou seja:

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

Então use um cursor regular (não-dinâmico) para percorrer a tabela ##MyGlobalTemp (e não se esqueça de largar a temperatura depois de terminar).

Ou seja:

DECLARE myCursor CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR SELECT column1, column2, etc.. FROM  ##MyGlobalTemp...... etc..
Os cursores dinâmicos podem ficar peludos. Certifique-se apenas de que a temperatura tem um global (##) ambito. Espero que isto ajude.
 0
Author: Milan, 2017-08-08 22:38:33