2016-02-11 116 views
0

我在select语句中获取了id的列表。如何通过每个ID循环并打印下面如何遍历ID列表

DECLARE @InventoryID INT 
Select @InventoryID = I.InventoryID 
From G2owner.LoadSlip L (nolock) 
    Inner Join G2owner.LoadSlipReleaseOrderMapping LM (nolock) on L.LoadSlipID = LM.LoadSlipID 
    Inner Join G2owner.LoadSlipDetail LSD (nolock) on LM.LoadSlipReleaseOrdermappingID = LSD.LoadSlipReleaseOrdermappingID 
    Inner Join G2owner.Inventory I (nolock) on LSD.InventoryID = I.InventoryID 
Where LM.ReleaseOrderID = 7156 and L.LoadSlipID = 3014 
     and L.TerminalID = 3 and I.InventoryEndDate IS NULL and I.TotalNetWeight = 0.0000000 

PRINT @InventoryID 
+0

是什么让你觉得你需要一个循环?只需使用'Select I.InventoryID From ...'。 –

+0

我需要循环,因为我需要在其他存储过程中的多个位置使用每个invetoryID – user1030181

+0

即使将ID列表转储到临时表,您也应尽量尝试尽量使用基于集合的逻辑。但是,如果你坚持要使用循环,你必须[使用游标](http://stackoverflow.com/questions/11856518/sql-server-2008-request-example-on-creating-a -cursor-to-loop-through-records)来执行你所描述的内容。 –

回答

1

避免游标或行操作,如果你可以因为它阻碍了性能,它使用循环的任何行,但如果你有:

DECLARE @InventoryID INT 

DECLARE myCursor CURSOR FOR 
SELECT I.InventoryID 
From G2owner.LoadSlip L with(nolock) 
    Inner Join G2owner.LoadSlipReleaseOrderMapping LM with(nolock) on L.LoadSlipID = LM.LoadSlipID 
    Inner Join G2owner.LoadSlipDetail LSD with(nolock) on LM.LoadSlipReleaseOrdermappingID = LSD.LoadSlipReleaseOrdermappingID 
    Inner Join G2owner.Inventory I with(nolock) on LSD.InventoryID = I.InventoryID 
Where LM.ReleaseOrderID = 7156 and L.LoadSlipID = 3014 
    and L.TerminalID = 3 and I.InventoryEndDate IS NULL and I.TotalNetWeight = 0.0000000 

OPEN myCursor 
FETCH NEXT FROM myCursor INTO @InventoryID 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    PRINT (@InventoryID); 
    FETCH NEXT FROM myCursor INTO @InventoryID 
END 
CLOSE myCursor 
DEALLOCATE myCursor 

而且WITH(nolock)会导致脏读!

+1

NOLOCK不仅仅是脏读。老实说,与使用该提示时可能发生的一些事情相比,脏读取是微不足道的。请参阅上面评论中的链接@marc_s,以获取有关提示带给表格的所有令人讨厌的内容的更多详细信息。 –