Processing of cursor returned by SQLSERVER stored procedure
1. Stored procedure returns cursor
Sql code
USE [TEST_DB] GO /****** [PRT].[Move_Data_Return_Cursor] Script Date: 03/08/2012 17:38:55 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /********************************************************************************* *把数据从表 DATA_SOURCE_TABLE 移动到表 TEST_TABLE . 返回游标供Move_Data_Handle_Cursor供Move_Data_Handle_Cursor存储过程使用. *DataServer: 110.110.110.110 *DataBase: TEST_DB *Name: [Move_Data_Return_Cursor] *Function: *Input: @overTimeHour INT *Output: @CURSOR_PriceChangeRecord CURSOR *Creator: GREATWQS 2012-02-23 *Updated: GREATWQS 2012-03-08 UPDATE NEW REQUIREMENT **********************************************************************************/ ALTER PROCEDURE [PRT].[Move_Data_Return_Cursor] -- Add the parameters for the stored procedure here @overTimeHour INT, @CURSOR_PriceChangeRecord CURSOR VARYING OUTPUT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- print @overTimeHour; -- 1. 声明游标: DECLARE CURSOR_PriceChangeRecord SET @CURSOR_PriceChangeRecord = CURSOR FORWARD_ONLY STATIC FOR SELECT ItemNo, ItemName, ItemColor, ItemSize, ItemMadeIn, InDate FROM PRT.DATA_SOURCE_TABLE WITH(NOLOCK) WHERE InDate > dateadd(HOUR, -@overTimeHour, getdate()) -- 在这里进行时间的限定. -- 2. 打开游标 OPEN @CURSOR_PriceChangeRecord END
Copy after login
2. Stored procedure returns cursor
Sql code
USE [TEST_DB] GO /****** [PRT].[Move_Data_RHandle_Cursor] Script Date: 03/08/2012 17:39:27 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /********************************************************************************* *把数据从表 DATA_SOURCE_TABLE 移动到表 TEST_TABLE *把游标中的数据,插入到表TEST_TABLE. *DataServer: 110.110.110.110 *DataBase: TEST_DB *Name: [Move_Data_Handle_Cursor] *Function: *Input: @overTimeHour INT *Output: *Creator: GREATWQS 2012-02-23 *Updated: GREATWQS 2012-03-08 UPDATE NEW REQUIREMENT **********************************************************************************/ ALTER PROCEDURE [PRT].[Move_Data_Handle_Cursor] -- 超时时间(小时) @overTimeHour INT AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; DECLARE -- 需要插入表TEST_TABLE,数据来源声明 @ItemNumber_Insert CHAR(20), @ItemName_Insert CHAR(50), @ItemColor_Insert CHAR(10), @ItemSize_Insert CHAR(5), @ItemWhereMadeIn_Insert CHAR(20), @createTime_Insert DATETIME, @changeTime_Insert DATETIME, @lastChangeTime_Insert DATETIME, @priority_Insert INT, @itemType_Insert INT, @active_Insert INT, -- ItemNumber Record num in table @totalNum_SelectDB INT, @changeTime_SelectDB DATETIME -- Set Default Value SET @ItemWhereMadeIn_Insert = 0 SET @createTime_Insert = getdate() SET @lastChangeTime_Insert = null SET @priority_Insert = 0 SET @itemType_Insert = 0 SET @active_Insert = 1 -- 1. 声明游标: 在过程内部自己定义有游标时,调用游标前面不加@符号 DECLARE @CURSOR_Result CURSOR -- 2. 得到上个游标, 上个游标已经打开 EXEC Move_Data_Return_Cursor @overTimeHour, @CURSOR_PriceChangeRecord = @CURSOR_Result OUTPUT -- 3. 抓取游标中的数据: FETCH CURSOR_Result FETCH NEXT FROM @CURSOR_Result INTO @ItemNumber_Insert, @ItemName_Insert, @ItemColor_Insert, @ItemSize_Insert, @changeTime_Insert -- 4. 对游标中的每一个记录进行处理: 循环 WHILE (@@FETCH_STATUS = 0) BEGIN -- 查看此ItemNumber_Insert是否已经存在表中 SELECT TOP 1 @totalNum_SelectDB = COUNT(*) FROM PRT.TEST_TABLE WITH(NOLOCK) WHERE ItemNumber = @ItemNumber_Insert -- 如果表不存在此@ItemNumber_Insert, 则插入 IF @totalNum_SelectDB = 0 BEGIN INSERT INTO PRT.TEST_TABLE( [ItemNumber], [ItemName], [ItemColor], [ItemSize], [MadeIn], [createTime], [changeTime], [lastChangeTime], [priority], [itemType], [active]) VALUES ( @ItemNumber_Insert, @ItemName_Insert, @ItemColor_Insert, @ItemSize_Insert, @ItemWhereMadeIn_Insert, @createTime_Insert, @changeTime_Insert, @lastChangeTime_Insert, @priority_Insert, @itemType_Insert, @active_Insert ) END -- 如果此ItemNumber存在于表中 ELSE BEGIN -- 查看此ItemNumber_Insert的记录 SELECT TOP 1 @changeTime_SelectDB = changeTime FROM PRT.TEST_TABLE WITH(NOLOCK) WHERE ItemNumber = @ItemNumber_Insert -- If item has exists in table, and changeTime<=newItem.changeTime -- fresh the changeTime = newItem.changeTime, set active=1; IF @changeTime_SelectDB < @changeTime_Insert BEGIN UPDATE PRT.TEST_TABLE SET changeTime = @changeTime_Insert, active = 1 WHERE ItemNumber = @ItemNumber_Insert END END -- FETCH NEXT RECORD FROM @CURSOR_Result FETCH NEXT FROM @CURSOR_Result INTO @ItemNumber_Insert, @ItemName_Insert, @ItemColor_Insert, @ItemSize_Insert, @changeTime_Insert END -- 5. 关闭游标 CLOSE @CURSOR_Result -- 6. 删除游标 DEALLOCATE @CURSOR_Result -- Delete overtime item, set active=0:changeTime<getdate()-48; UPDATE PRT.TEST_TABLE SET active=0 WHERE changeTime < dateadd(HOUR, -@overTimeHour, getdate()) END
Copy after login
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article
What's New in Windows 11 KB5054979 & How to Fix Update Issues
4 weeks ago
By DDD
How to fix KB5055523 fails to install in Windows 11?
3 weeks ago
By DDD
How to fix KB5055518 fails to install in Windows 10?
3 weeks ago
By DDD
Strength Levels for Every Enemy & Monster in R.E.P.O.
3 weeks ago
By 尊渡假赌尊渡假赌尊渡假赌
Blue Prince: How To Get To The Basement
3 weeks ago
By DDD

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)
