使用cursor编写统计指定日期前订单数存储过程报类型不兼容错误如何解决
错误原因及修复方案
直接报错根源
你收到的类型不匹配错误是存储过程调用时参数顺序错误导致的:
你定义的存储过程第一个参数是date类型的入参@date,第二个才是int类型的出参@count,调用时你只传了一个int类型的@count参数,直接塞给了第一个date类型的入参位置,直接触发类型冲突报错。
其他代码逻辑问题
- 缺少存储游标读取结果的临时变量,你直接把游标读取到的订单日期赋值给了入参
@date,会覆盖原本传入的比对日期 - 游标循环内没有新增
FETCH NEXT语句,执行后会进入死循环 - 比对日期硬编码为
'2019-03-11',没有用到传入的@date参数,不符合“检查指定日期前订单”的需求 - 需求是统计指定日期前的订单总数,原有打印文案写的是“after 2019-03-11”,逻辑不匹配
修正后完整代码
存储过程定义
CREATE OR ALTER PROCEDURE OrderBeforeDate (@checkDate date, -- 调整入参名避免和订单日期字段混淆 @count int OUT) AS BEGIN SET @count = 0; -- 声明临时变量存储游标读取的每条订单日期 DECLARE @orderDate date; DECLARE cursor1 SCROLL CURSOR FOR SELECT [Sales].[dbo].[Order].[Date] FROM [Sales].[dbo].[Order] FOR READ ONLY OPEN cursor1; -- 读取订单日期存入专门的临时变量,不覆盖入参 FETCH NEXT FROM cursor1 INTO @orderDate WHILE @@FETCH_STATUS = 0 BEGIN -- 用传入的比对日期做判断,统计指定日期前的订单 IF @orderDate <= @checkDate SET @count = @count + 1; -- 循环内读取下一条,避免死循环 FETCH NEXT FROM cursor1 INTO @orderDate END CLOSE cursor1; DEALLOCATE cursor1; END
存储过程调用
DECLARE @totalCount int -- 显式指定参数名避免顺序错误,传入需要查询的截止日期 EXEC OrderBeforeDate @checkDate = '2019-03-11', @count = @totalCount OUT PRINT '2019-03-11之前的订单数量: ' + CAST(@totalCount AS VARCHAR(10))
内容的提问来源于stack exchange,提问作者DudeLostInCode
相关产品推荐
相关产品推荐

