Select语句从存储过程返回值

问题描述

我正在编写一个带有以下参数的存储过程:

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