2010-03-06 51 views
2

我不擅长SQL Server 2000.我有一个以逗号分隔的ID列表。我需要看看这个ID是否存在于一个表中。如果是这样,我想跳出一个保存在我可以在存储过程中使用的变量中的ID的循环。这是我现在正在尝试的:SQL Server 2000 - 打破循环

DECLARE @coreID INT 
SET @coreID=NULL 

DECLARE @itemID NVARCHAR(50) 
DECLARE itemCursor CURSOR LOCAL FAST_FORWARD FOR 
    SELECT [String] AS 'itemID' FROM dbo.SplitListIntoTable(@myIDs) 

OPEN itemCursor 
FETCH NEXT FROM itemCursor INTO @itemID 
    WHILE @@FETCH_STATUS = 0 BEGIN 

    -- If @itemID EXISTS IN MyTable set @[email protected] and Break. How do I do this? 

    FETCH NEXT FROM itemCursor INTO @itemID 
END 

CLOSE itemCursor 
DEALLOCATE itemCursor 

谢谢!

回答

4

理想情况下,您不应该使用游标,因为性能不会很好。如果你能做到这一点作为一个基于集合的说法,这样做反而,也许是这样的:

SELECT TOP 1 @CoreID = [String] 
FROM dbo.SplitListIntoTable(@myIDs) x 
    JOIN MyTable t ON x.[String] = t.ID 

但是,如果你有一个真正的理由使用游标,您可以使用BREAK语句打出来的WHILE循环

例如

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     IF EXISTS(SELECT * FROM MyTable WHERE Id = @ItemID) 
      BEGIN 
       SET @CoreId = @ItemId 
       BREAK 
      END   

     FETCH NEXT FROM itemCursor INTO @itemID 
    END 
0

我不知道如何使用游标来做到这一点,但我认为你可以用一个连接做得更好(更快)。如果dbo.SplitListIntoTable(@myIDs)的输出实际上是一个已排序的表,那么您可以输出另一个列的表格,也就是说字符串numer,1,2,3等等......

(I don “T在我的面前SQL来测试这一点,但像)

create table t(itemNum int identity, itemId nvarchar(max)) 

insert into t (item id) select 1 from dbo.SplitListIntoTable(@myIDs) 

再加入两个取前一个

set @coreID = 
select top 1 @itemID 
from MyTable m 
inner join t t.itemid = m.itemid 
order by m.itemNum asc 

当然,你可以使用一个CTE,台VAR或临时桌子也是。