我尝试使用动态查询来声明游标。基本上我有一个表值函数的名称,我将用于游标作为表的一列,所以我必须使用SQL语句声明游标。
问题是T-SQL没有将myCursor
识别为有效游标。
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
欢迎提供任何帮助或解决方法。
编辑:我通过声明光标并使用sqlstatement的输出传递值来解决问题。DECLARE @myCursor CURSOR
SET @sqlStatement =' SET @myCursor = CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR SELECT * FROM' + @FunctionName +'('' + @RecordId +''');打开@myCursor;'
EXEC sp_executesql @sqlStatement,N' @Placeholder nvarchar(250),@ Prictorholdervalue nvarchar(250),@ myCursor CURSOR OUTPUT',@ Prlaceholder = @Placeholder,@ Prientholdervalue = @Placeholdervalue,@ myCursor = @ myCursor OUTPUT
答案 0 :(得分:0)
这不是最佳解决方案,但如果您真的必须这样做 - 更简单的方法是使用动态SQL首先将所需数据加载到全局临时表中。动态SQL语句更简单,即:
SET @sqlStatement = 'SELECT * INTO ##MyGlobalTemp FROM ' + @FunctionName + '(''' + @RecordId + ''')'
EXEC sp_executesql @sqlStatement
然后使用常规(非动态)光标循环遍历## MyGlobalTemp表(并且在完成后不要忘记删除temp。)
即:
DECLARE myCursor CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR SELECT column1, column2, etc.. FROM ##MyGlobalTemp...... etc..
动态游标可能变得毛茸茸。只需确保temp具有全局(##)范围。
希望这有帮助。