使用while循环读取存储过程中行的值

时间:2018-05-17 07:01:26

标签: sql-server stored-procedures while-loop

我开始学习循环了。我有示例代码,但遗憾的是我可以操作while循环。

需要读取列状态的所有值,我可以在第一个A和最后一个B中对它进行排序。

TABLE 

ID  Time                    Status      
12  2018-05-04 08:00:00     A
12  2018-05-04 09:00:00     A
12  2018-05-04 11:00:00     B
12  2018-05-04 13:00:00     A
12  2018-05-04 15:00:00     B
12  2018-05-04 18:00:00     B

我只能检测所有值是使用while循环这是我的示例代码

DECLARE  @rc tinyint

SET @rc = @@ROWCOUNT


BEGIN 

WHILE (@rc <= 1)

BEGIN 

If (@in = 'A')

BEGIN

WITH Param As (Select * FROM Table WHERE Status='A')

SELECT MAX(Status) FROM Param 

END

END

END

This image show the value should display

OUTPUT

ID  Time                    Status
12  2018-05-04 08:00:00     A
12  2018-05-04 11:00:00     B
12  2018-05-04 13:00:00     A
12  2018-05-04 18:00:00     B

请帮帮我吗?它真的越来越难有无限循环

1 个答案:

答案 0 :(得分:1)

请注意,对于这些类型的查询,使用while循环不是一个好的选择。这将是昂贵的。

您不需要while循环来实现这一目标,可以采用更简单的方式完成,例如使用UNIONROW_NUMBER(),如下所示。

SELECT Id,Status FROM
(
 SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) RN FROM [Table] WHERE Status='A'
 UNION
 SELECT *, ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) RN FROM [Table] WHERE Status='B'
)T ORDER BY RN

<强> DEMO

修改

正如您所提到的,您有日期列来订购数据。对于此方案,您可以在SQL Server中使用LAG

SELECT Id,Status FROM
(
 SELECT *, LAG(Status) OVER(ORDER BY [Date]) NextStatus FROM [TableName]
) T
WHERE Status <> NextStatus OR NextStatus IS NULL

<强> DEMO

编辑2: SQL Server 2005

SELECT Id,Status FROM
(
 SELECT *, 
 (
    SELECT TOP 1 Status FROM [TableName] t2 WHERE t2.[Date] < t.Date ORDER BY DATE desc  
 ) AS NextStatus
 FROM [TableName] t
) T
WHERE t.Status <> NextStatus OR NextStatus IS NULL

<强> DEMO