如何在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的表中。 也许你打算从@Practitioner
select:
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链接。 参考这个简单的例子。