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行的任何内容。