加入收藏 | 设为首页 | 会员中心 | 我要投稿 大连站长网 (https://www.0411zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql-server – SQL Server存储过程避免游标

发布时间:2021-05-16 13:04:06 所属栏目:MsSql教程 来源:网络整理
导读:我有以下SQL Server存储过程: BEGIN TRANCREATE TABLE #TempTable ( SampleOrderID int,SampleOrderNo varchar(512),ChallanNoAndChallanDate varchar(MAX) )CREATE NONCLUSTERED INDEX #IX_Temp2_1 ON #TempTable(SampleOrderID)DECLARE @SQL as varchar

我有以下SQL Server存储过程:

BEGIN TRAN
CREATE TABLE #TempTable (
                            SampleOrderID int,SampleOrderNo varchar(512),ChallanNoAndChallanDate varchar(MAX)
                        )
CREATE NONCLUSTERED INDEX #IX_Temp2_1 ON #TempTable(SampleOrderID)

DECLARE 
@SQL as varchar(MAX)
SET @SQL='      SELECT  SampleOrderID,SampleOrderNo FROM SampleOrder WHERE SampleOrderID IN (37808,37805,37767,37571,37745,37772,37843,37394,37909,37905,37903) '
INSERT INTO #TempTable  (SampleOrderID,SampleOrderNo)
EXEC (@SQL)

DECLARE 
@SampleOrderID as int,@ChallanNoAndChallanDate as varchar(max)

DECLARE Cur_AB1 CURSOR GLOBAL FORWARD_ONLY KEYSET FOR           
SELECT  SampleOrderID FROM #TempTable
OPEN Cur_AB1
FETCH NEXT FROM Cur_AB1 INTO @SampleOrderID
WHILE(@@Fetch_Status <> -1)
    BEGIN--2
        SET @ChallanNoAndChallanDate=''
        SELECT @ChallanNoAndChallanDate= COALESCE(@ChallanNoAndChallanDate+ ',','') + CONVERT(VARCHAR(12),ChallanDate,106)+':'+ChallanNo  FROM Challan WHERE OrderID =@SampleOrderID AND OrderType=2

        UPDATE #TempTable SET ChallanNoAndChallanDate=@ChallanNoAndChallanDate WHERE SampleOrderID=@SampleOrderID   
        FETCH NEXT FROM Cur_AB1 INTO @SampleOrderID
    END--2
CLOSE Cur_AB1
DEALLOCATE Cur_AB1

SELECT * FROM #TempTable
DROP TABLE #TempTable
COMMIT TRAN

输出:

SamID       SamNo    ChallanNoAndDaet
37394   37394,31 May 2012:151592
37571   37571,31 May 2012:151580
37745   37745,31 May 2012:151582
37767   37767,30 May 2012:151507,31 May 2012:151576
37772   37772,31 May 2012:151587
37805   37805,31 May 2012:151574
37808   37808,31 May 2012:151573
37843   37843,31 May 2012:151588
37903   37903,31 May 2012:151597
37905   37905,31 May 2012:151596
37909   37909,31 May 2012:151593

它适用于少量数据,但当我尝试在大卷(即超过500,000条记录)上执行它时,我的C#接口会抛出超时异常.

任何人都可以帮我编辑我的存储过程以避免光标?

谢谢你的回复.

解决方法

我通常使用以下内容:
SELECT @SampleOrderID = MIN (SampleOrderID) FROM #TempTable
WHILE @SampleOrderID IS NOT NULL
BEGIN

   SET @ChallanNoAndChallanDate=''
   SELECT @ChallanNoAndChallanDate= COALESCE(@ChallanNoAndChallanDate+ ',106)+':'+ChallanNo  FROM Challan WHERE OrderID =@SampleOrderID AND OrderType=2

   UPDATE #TempTable SET ChallanNoAndChallanDate=@ChallanNoAndChallanDate WHERE SampleOrderID=@SampleOrderID   

   SELECT @SampleOrderID = MIN (SampleOrderID) FROM #TempTable WHERE SampleOrderID > @SampleOrderID 

END

此代码将替换您拥有的光标.

(编辑:大连站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读