sql-server – SQL Server存储过程避免游标
发布时间:2021-05-22 06:03:20 所属栏目: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 此代码将替换您拥有的光标. (编辑:滁州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 一个Bug损失200亿!如何搭建业务异常检测系统?
- Symfony2(WebsocketBundle) – 简单的私有(和组)聊天数据库
- SQL SERVER中Case语句的用法
- sql – NATURAL(JOIN)在生产环境中被认为是有害的吗?
- 在SQL Server上逐字使用SOUNDEX()
- sql – 复制记录以填补日期之间的差距
- SQL Server数据导入导出工具BCP使用详解
- sql-server-2008 – SQL 2008每10分钟执行一次CHECKDB,任何
- ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统之前端
- 微软改动IE将对有Flash的网络广告产生影响
站长推荐
热点阅读