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
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.