商店程序中的这段代码工作了多年,现在在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
答案 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