使用游标计算给定日期之前的订单数量的过程

Procedure with cursor for counting a number of orders before a given date

检查给定日期(Date 列)之前是否有任何订单。该过程有一个作为日期的传递参数“date”和另一个传递参数“count”。此参数returns此日期之前的订单数。

简单的方法是:

SELECT COUNT([Sales].[dbo].[Order].[Date])
FROM [Sales].[dbo].[Order]
WHERE [Sales].[dbo].[Order].[Date] >= '2019-03-11'

但不幸的是我不得不使用程序和游标。我的尝试是这样的:

CREATE OR ALTER PROCEDURE OrderBeforeDate
    (@date date, 
     @count int OUT)
AS
BEGIN
    SET @count = 0;

    DECLARE cursor1 SCROLL CURSOR FOR
        SELECT [Sales].[dbo].[Order].[Date] 
        FROM [Sales].[dbo].[Order]
        FOR READ ONLY

    OPEN cursor1;

    FETCH NEXT FROM cursor1 INTO @date

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF @date <= '2019-03-11'
            SET @count = @count + 1;
    END

    CLOSE cursor1;
    DEALLOCATE cursor1;
END

DECLARE @count int

EXEC OrderBeforeDate @count OUT

PRINT 'Number of Orders after 2019-03-11'': ' + CAST(@count AS VARCHAR(10))

但我收到以下错误消息:

Operand type collision: int is incompatible with date

我不知道该怎么办。请帮帮我

您可能在调用 OrderBeforeDate 过程时错过了为日期参数提供值。您只传入 1 个参数,SQL 服务器可能会将 @count 值视为日期参数的值。

EXEC OrderBeforeDate @count OUT

您没有传递预期的参数。在您的模型中,我希望看到

DECLARE @count int=0, @Date date='20190311'

EXEC OrderBeforeDate @Date, @count OUT

PRINT 'Number of Orders after 2019-03-11: ' + CAST(@count AS VARCHAR(10))

我还要指出(正如您可能已经知道的那样)这个游标除了阻碍 SQL 服务器性能之外没有任何作用。

此外,您的程序正在计算 您的日期值之前的行数,您的 print 语句则相反。

您的存储过程需要 2 个参数,而您 ide 只有一个。缺少日期参数。 你的光标无限循环,你的程序永远不会结束

为此使用游标非常糟糕idea,请将您的计数放入 sored 过程中

感谢您的参与!我认为它现在可以使用这样的代码:

CREATE OR ALTER PROC OrderBeforeDate(@date date, @count int out)
AS
BEGIN

SET @count = 0;

DECLARE cursor1 scroll cursor for
SELECT [Sales].[dbo].[Order].[Date] 
FROM [Sales].[dbo].[Order]
FOR READ ONLY

OPEN cursor1;
FETCH NEXT FROM cursor1 INTO @date
WHILE @@FETCH_STATUS = 0
BEGIN
IF @date < '2019-03-11'
    SET @count = @count + 1;
    FETCH NEXT FROM cursor1 INTO @date
END

CLOSE cursor1;
DEALLOCATE cursor1;

END


DECLARE @count int
DECLARE @date date
EXEC OrderBeforeDate @date, @count OUT

PRINT 'Number of Orders before 2019-03-11: ' + CAST(@count AS VARCHAR(10))

你说得对,这个方法比我一开始提到的方法慢得多。 (1 分钟对不到一秒) 感谢大家的帮助!