如何在SQL Server中编写一个foreach?

我正在尝试按照for-each的方式来实现某些东西,在这里我想把返回的select语句的id和使用它们中的每一个。

DECLARE @i int DECLARE @PractitionerId int DECLARE @numrows int DECLARE @Practitioner TABLE ( idx smallint Primary Key IDENTITY(1,1) , PractitionerId int ) INSERT @Practitioner SELECT distinct PractitionerId FROM Practitioner SET @i = 1 SET @numrows = (SELECT COUNT(*) FROM Practitioner) IF @numrows > 0 WHILE (@i <= (SELECT MAX(idx) FROM Practitioner)) BEGIN SET @PractitionerId = (SELECT PractitionerId FROM @Practitioner WHERE idx = @i) --Do something with Id here PRINT @PractitionerId SET @i = @i + 1 END 

目前,我有像上面的东西,但得到错误:

无效的列名称“idx”。

有人可以帮我纠正一个for-each在SQL中的这种尝试。

提前致谢。

你似乎想用一个CURSOR 。 虽然大多数情况下最好使用基于集合的解决scheme,但有些时候CURSOR是最好的解决scheme。 不知道更多关于你真正的问题,我们不能帮助你更多的:

 DECLARE @PractitionerId int DECLARE MY_CURSOR CURSOR LOCAL STATIC READ_ONLY FORWARD_ONLY FOR SELECT DISTINCT PractitionerId FROM Practitioner OPEN MY_CURSOR FETCH NEXT FROM MY_CURSOR INTO @PractitionerId WHILE @@FETCH_STATUS = 0 BEGIN --Do something with Id here PRINT @PractitionerId FETCH NEXT FROM MY_CURSOR INTO @PractitionerId END CLOSE MY_CURSOR DEALLOCATE MY_CURSOR 

假设PractitionerId列是唯一的,那么你可以使用下面的循环

 DECLARE @PractitionerId int = 0 WHILE(1 = 1) BEGIN SELECT @PractitionerId = MIN(PractitionerId) FROM dbo.Practitioner WHERE PractitionerId > @PractitionerId IF @PractitionerId IS NULL BREAK SELECT @PractitionerId END 

您的select计数,并select最大值应该从您的表variables,而不是实际的表

 DECLARE @i int DECLARE @PractitionerId int DECLARE @numrows int DECLARE @Practitioner TABLE ( idx smallint Primary Key IDENTITY(1,1) , PractitionerId int ) INSERT @Practitioner SELECT distinct PractitionerId FROM Practitioner SET @i = 1 SET @numrows = (SELECT COUNT(*) FROM @Practitioner) IF @numrows > 0 WHILE (@i <= (SELECT MAX(idx) FROM @Practitioner)) BEGIN SET @PractitionerId = (SELECT PractitionerId FROM @Practitioner WHERE idx = @i) --Do something with Id here PRINT @PractitionerId SET @i = @i + 1 END 

我会说一切可能工作,除了列idx实际上不存在于你select的表中。 也许你打算从@Practitionerselect:

 WHILE (@i <= (SELECT MAX(idx) FROM @Practitioner)) 

因为这是在上面的代码中定义的:

 DECLARE @Practitioner TABLE ( idx smallint Primary Key IDENTITY(1,1) , PractitionerId int ) 

以下行在您的版本中是错误的:

 WHILE (@i <= (SELECT MAX(idx) FROM @Practitioner)) 

(缺less@)

可能是一个想法来改变你的命名约定,以便表格更加不同。

尽pipe游标通常被认为是可怕的邪恶,但我相信这是FAST_FORWARD游标的一种情况 – 您可以在TSQL中获得FOREACH最接近的东西。

您需要SQL Server光标。

这是一个MSDN链接。 参考这个简单的例子。