使用游标计算给定日期之前的订单数量的过程
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 分钟对不到一秒)
感谢大家的帮助!
检查给定日期(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 分钟对不到一秒) 感谢大家的帮助!