SQL Server中的WHILE和CONTINUE语句

在SQL Server中,WHILECONTINUE是两个非常有用的语句,用于在循环中控制流程。WHILE语句允许我们在满足一定条件的情况下重复执行一段代码,而CONTINUE语句则用于跳过当前迭代并继续下一次迭代。

WHILE语句的用法

WHILE语句的语法如下所示:

WHILE condition
BEGIN
    statement1
    statement2
    ...
    statementN
END

condition是一个布尔表达式,当其为真时,循环体内的语句会被执行。而当条件为假时,循环会终止。

让我们来看一个简单的例子,假设我们有一个Sales表,其中包含了订单信息。我们想要逐行遍历该表,并计算所有订单的总金额:

DECLARE @TotalAmount decimal(10,2) = 0
DECLARE @RowNum int = 1

WHILE @RowNum <= (SELECT COUNT(*) FROM Sales)
BEGIN
    -- 计算当前行的金额并加到总金额中
    SET @TotalAmount = @TotalAmount + (SELECT Amount FROM Sales WHERE RowNum = @RowNum)
    SET @RowNum = @RowNum + 1
END

SELECT @TotalAmount AS TotalAmount

上述代码首先声明了两个变量@TotalAmount@RowNum,分别用于存储总金额和当前行号。然后,通过一个WHILE循环逐行遍历表,并将每一行的金额加到总金额中。最后,我们使用SELECT语句显示计算得到的总金额。

CONTINUE语句的用法

CONTINUE语句用于跳过当前迭代并继续下一次迭代。它在循环体内部的条件判断之前使用。

让我们继续上面的例子,假设我们不想计算销售额为0的订单,我们可以使用CONTINUE语句来跳过这些订单:

DECLARE @TotalAmount decimal(10,2) = 0
DECLARE @RowNum int = 1

WHILE @RowNum <= (SELECT COUNT(*) FROM Sales)
BEGIN
    -- 跳过销售额为0的订单
    IF (SELECT Amount FROM Sales WHERE RowNum = @RowNum) = 0
        CONTINUE
    
    -- 计算当前行的金额并加到总金额中
    SET @TotalAmount = @TotalAmount + (SELECT Amount FROM Sales WHERE RowNum = @RowNum)
    SET @RowNum = @RowNum + 1
END

SELECT @TotalAmount AS TotalAmount

在上述代码中,我们使用IF语句来判断销售额是否为0。如果为0,我们使用CONTINUE语句跳过当前迭代,直接进入下一次迭代。这样,只有销售额不为0的订单才会被计入总金额中。

关系图

下面是一个示例关系图,展示了一个销售系统中的实体关系:

erDiagram
    CUSTOMER ||--o{ ORDER : places
    ORDER ||--o{ ORDER_ITEM : contains
    PRODUCT ||--|{ ORDER_ITEM : includes

在这个关系图中,我们可以看到CUSTOMER实体与ORDER实体之间是一对多的关系,一个客户可以下多个订单。而ORDER实体与ORDER_ITEM实体之间也是一对多的关系,一个订单可以包含多个订单项。ORDER_ITEM实体与PRODUCT实体之间是多对一的关系,一个订单项包含一个产品。

类图

下面是一个示例类图,展示了一个简单的订单管理系统中的类结构:

classDiagram
    class Customer {
        +int CustomerId
        +string CustomerName
        +string Address
        +string Phone
        +List<Order> Orders
    }

    class Order {
        +int OrderId
        +DateTime OrderDate
        +decimal TotalAmount
        +List<OrderItem> OrderItems
        +Customer Customer
    }

    class OrderItem {
        +int OrderItemId
        +int Quantity
        +decimal UnitPrice
        +decimal