如何在T-SQL中动态声明游标?

时间:2017-08-08 16:17:23

标签: sql-server tsql dynamic cursor user-defined-functions

我尝试使用动态查询来声明游标。基本上我有一个表值函数的名称,我将用于游标作为表的一列,所以我必须使用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

1 个答案:

答案 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具有全局(##)范围。

希望这有帮助。