在动态sql中声明游标

时间:2012-03-08 10:54:42

标签: sql sql-server tsql cursor dynamic-sql

商店程序中的这段代码工作了多年,现在在OPEN行我得到名称为...的游标不存在

sp_executesql中的某些内容是否发生了变化,可能导致其中断?

是否有另一种方法(对动态SQL的需求是因为@Types参数作为IN子句的预格式化字符串传入?)

Select @Query = 'DECLARE cur_person CURSOR FOR
                 SELECT *
                 FROM MyTable
                 WHERE PersonID = @PersonnelID
                 AND Type in '  + @Types + '    <== formatted list for IN clause

EXEC sp_executesql @Query
OPEN cur_person                   <== get cursor doesn't exist error

2 个答案:

答案 0 :(得分:1)

在您的示例中,这意味着光标是在本地定义的。

您可以使用数据库选项(CURSOR_DEFAULT)全局定义它,但这可能不是一个好主意。

您可以做的另一件事是将所有代码放在查询中并执行它。

答案 1 :(得分:0)

我不知道它失败的原因,但这里是一个拆分功能,可以避免动态查询的需要:

创建功能StringToTable (     @p_list varchar(MAX),     @p_separator varchar(5)=',',     @p_distinct bit = null ) 退货 @ParsedList表 (     元素varchar(500) ) 如 BEGIN

DECLARE @v_element varchar(500), @Pos int, @v_insert_ind bit

SET @p_list = LTRIM(RTRIM(@p_list))+ @p_separator
SET @Pos = CHARINDEX(@p_separator, @p_list, 1)

IF REPLACE(@p_list, @p_separator, '') <> ''
BEGIN
    WHILE @Pos > 0
    BEGIN
        SET @v_insert_ind = 1
        SET @v_element = LTRIM(RTRIM(LEFT(@p_list, @Pos - 1)))
        IF @v_element <> ''
        BEGIN
            IF (@p_distinct = 1)
            AND (SELECT count(element) FROM @ParsedList WHERE element = @v_element) > 0
                SET @v_insert_ind = 0
            IF @v_insert_ind = 1
            BEGIN
                INSERT INTO @ParsedList (element) 
                VALUES (@v_element)
            END
        END
        --
        SET @p_list = RIGHT(@p_list, LEN(@p_list) - @Pos)
        SET @Pos = CHARINDEX(@p_separator, @p_list, 1)
    END
END

RETURN
END