问题描述
我正在编写一个带有以下参数的存储过程:
CREATE PROCEDURE spDaterange
@InvNo varchar(50) OUTPUT,@InvDt date OUTPUT,@InvDueDt date OUTPUT,@InvTot money OUTPUT,@InvBal money OUTPUT,@minDate varchar(30) = NULL,@maxDate varchar(30) = NULL
AS...
验证后,我尝试对结果集执行以下选择:
SELECT
@InvNo,@InvDt,@InvDueDt,@InvTot,(Invoicetotal - CreditTotal - PaymentTotal) AS @InvBal --Syntax ERROR
FROM
Invoices
WHERE
InvoiceDate >= @minDate
AND InvoiceDate <= @maxDate
ORDER BY
InvoiceDate;
我想计算到期余额并将其与符合条件的表中的列一起传回。
另外,这些参数的返回是否隐含?我没有使用返回值(整数)。
解决方法
您的语法有缺陷,您没有为变量分配任何值(大概是您想返回),您需要指定 top 1
例如
SELECT top 1
@InvNo=InvNo,@InvDt=InvDt,@InvDueDt=InvDueDt,@InvTot=InvTot,@InvBal=(InvoiceTotal - CreditTotal - PaymentTotal)
FROM
Invoices
WHERE
InvoiceDate >= @minDate
AND InvoiceDate <= @maxDate
ORDER BY
InvoiceDate;
变量一旦赋值,将返回给调用过程(参数上也需要输出子句)
,使用日期类型参数。不要对日期使用字符类型。
返回列值,而不是变量
别名 (AS) 不能是变量
在 @minDate 和 @maxDate 的 where 中测试 NULL,因为您正在使用 可选参数
CREATE PROCEDURE spDateRange
@minDate DATETIME2(0) = NULL,@maxDate DATETIME2(0) = NULL
AS
BEGIN
SELECT
i.InvNo,i.InvDt,i.InvDueDt,i.InvTot,InvoiceTotal - CreditTotal - PaymentTotal AS InvBal
FROM Invoices i
WHERE
(@minDate IS NULL OR InvoiceDate >= @minDate)
AND (@maxDate IS NULL OR InvoiceDate <= @maxDate)
ORDER BY InvDate
END