Sql 使用表值函数和游标的存储过程。获取光标不存在错误

Sql 使用表值函数和游标的存储过程。获取光标不存在错误,sql,sql-server,tsql,Sql,Sql Server,Tsql,我在运行存储过程时遇到以下错误。存储过程调用一个函数,该函数使用返回表值函数的函数为表声明游标。请注意,我没有包括代码的声明部分 declare cust_trn cursor local for SELECT * FROM [dbo].[Q03_Create_Customer_Trn](@COUNTERPARTY) IF CURSOR_STATUS('local','cust_trn') <>-1 BEGIN OPEN cust_trn END FETCH NEXT

我在运行存储过程时遇到以下错误。存储过程调用一个函数,该函数使用返回表值函数的函数为表声明游标。请注意,我没有包括代码的声明部分

declare cust_trn cursor local for SELECT * FROM [dbo].[Q03_Create_Customer_Trn](@COUNTERPARTY)

IF CURSOR_STATUS('local','cust_trn') <>-1 
BEGIN
    OPEN cust_trn
END

FETCH NEXT FROM cust_trn  INTO @trn,@cust_name;

WHILE @@FETCH_STATUS=0
  BEGIN    
      IF (@LIST1 IS NULL) BEGIN
          SET @LIST1= @cust_name;
      END
      ELSE BEGIN
          SET @LIST1=ISNULL(@LIST1, '') + ';' + ISNULL(@cust_name, '');
      END 
   FETCH NEXT FROM cust_trn INTO @trn,@cust_name; END   END ELSE BEGIN  SET @LIST1 = 'N/A'; END CLOSE cust_trn ; DEALLOCATE  cust_trn; RETURN ISNULL(@LIST1,'N/A'); END; ISNULL(@LIST1,'N/A'); END;

错误是名为“cursor\u name”的游标不存在。函数begin在存储过程中被称为dbo.Q03\u get\u list\u of\u counterparties counterparty,“Y”CParties

您可以将整个游标逻辑重写为以下内容

declare @List varchar(500) = '' --use whatever size is relevant.

select @List = @List + cust_name + ';'
from [dbo].[Q03_Create_Customer_Trn](@COUNTERPARTY)

select @List = left(@List, len(@List) - 1) --removes the last comma

另一种选择是使用STUFF和FOR XML。互联网上有成百上千个这样的例子。

为什么不在没有支票的情况下打开客户帐户呢。您知道它的存在,因为您已经在一行之前声明了它。为什么您首先在这里使用游标?通过折磨行来处理这一行并不是您想要处理数据的方式。与使用游标相比,生成分隔列表要简单得多,速度也快得多。最后,您应该在sql server中编写游标。他们表现得很糟糕。Sql Server最好编写为基于集合的代码。你应该写一个新的问题,并要求帮助之前和之后,我需要没有提到光标。请停止在sql-server中写入光标代码。是否可以共享“Q03_创建_客户_Trn”的代码?我将返回与此…的CustomerUpNote相关的交易对手列表,或通过折磨行光标而指向RBAR行的任何内容。