如何根据某些条件在MSSQL游标中跳过一行(迭代),我有一个DTS可以迁移数千条记录,并且基于某些条件,某些记录不需要迁移,因为它们是重复的并且想要跳过这些记录。
知道如何在MSSQL Cursor中实现这一点吗?
由于
Sirak
答案 0 :(得分:2)
我在这里做了一些假设,但您可以使用以下内容作为指南:
-- create some test data
SELECT ' ' [Word] INTO #MyTempDataset;
INSERT INTO #MyTempDataset SELECT 'This';
INSERT INTO #MyTempDataset SELECT 'is';
INSERT INTO #MyTempDataset SELECT 'a';
INSERT INTO #MyTempDataset SELECT 'basic';
INSERT INTO #MyTempDataset SELECT 'basic';
INSERT INTO #MyTempDataset SELECT 'test';
DECLARE @counter INT
DECLARE @word VARCHAR(50)
DECLARE myCursor CURSOR
FOR SELECT *
FROM #MyTempDataset;
OPEN myCursor
FETCH NEXT FROM myCursor INTO @word
WHILE @@FETCH_STATUS = 0
BEGIN
-- check for condition
SELECT @counter = Count(*)
FROM #MyTempDataset
WHERE word = @word
IF @counter =1
BEGIN
-- process the unique records
PRINT @word
END
FETCH NEXT FROM myCursor INTO @word
END
CLOSE myCursor;
DEALLOCATE myCursor;
DROP TABLE #MyTempDataset;
答案 1 :(得分:1)
我想最简单的方法是在游标中编写IF语句。如果条件为假,您将跳过记录。
DECLARE @ID INT
DECLARE Curs CURSOR FAST_FORWARD
DECLARE @Cnt INT
CREATE TABLE ##Duplicates (ID INT, CarColor VARCHAR (50) )
FOR
SELECT DISTINCT CarID
FROM dbo.CarPark
WHERE CarColour <> 'red'
ORDER BY CarID
OPEN Curs
FETCH NEXT FROM Curs INTO @ID
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO ##Duplicates
SELECT CarID, CarColor
FROM dbo.CarPark
WHERE ID = @ID;
SET @Cnt = (SELECT Count(*) FROM ##Duplicates WHERE ID = @ID) ;
IF @Cnt < 2
THEN /* Migrate */
ELSE PRINT 'Duplicate'
END
FETCH NEXT FROM Curs INTO @ID
END
CLOSE Curs
DEALLOCATE Curs;
答案 2 :(得分:1)
我知道回答这个问题为时已晚。但为了其他用户寻求更好的答案。您只需拨打FETCH NEXT
即可跳过记录。
WHILE @@FETCH_STATUS = 0
IF @ParameterName = '@RETURN_VALUE'
FETCH NEXT FROM @procSchema INTO @ParameterName, @Type;
.... Rest of the logic goes here
使用这种方法,您不必将整个逻辑包装在If语句中,而是转移到跳过当前记录的下一条记录。
答案 3 :(得分:0)
我知道现在回答这个问题为时已晚,但对于将来的求职者来说。我相信MSDN
中介绍了解决此问题的正确方法您的代码正在使用WHILE循环(WHILE @@ FETCH_STATUS = 0)
要正确退出while循环,请使用BREAK关键字
要跳过循环,请使用CONTINUE关键字
从MSDN:
BREAK 从最里面的WHILE循环退出。在END关键字之后出现的所有语句(指示循环结束)都将被执行。
继续 导致WHILE循环重新启动,而忽略CONTINUE关键字之后的任何语句。
示例: -在声明并打开游标之后...
FETCH NEXT FROM Curs INTO @ID
WHILE @@FETCH_STATUS = 0
BEGIN
-- do something
IF [condition to skip record]
CONTINUE
FETCH NEXT FROM Curs INTO @ID
END