2

对我放轻松...仍然是新手 T-SQL 程序员 :)

我有一个存储过程,旨在获取三个输入参数,评估它们并发回一个参数(@eligible)。如果我只是执行一个带有硬编码变量的 T-SQL 脚本,我的 @@ROWCOUNT 会将 @eligible 设置为 1。当我作为存储过程执行对它的调用时,它不会正确返回 @eligible。这是程序:

ALTER PROCEDURE [dbo].[proc_Eligible]
                (@control AS nvarchar(10),
                 @checkno AS nvarchar(10),
                 @event_type AS nvarchar(7),
                 @eligible AS bit OUTPUT)
AS

BEGIN
    SET @eligible = 0

    SELECT @control AS Control, @checkno AS CheckNum

    -- Is the check drawn on an eligible bank?
SELECT
        H.CONTROL,
        H.NAME,
        H.RECV_DATE,
        H.CHECK_NUM,
        H.BANK,
        SUM(D.RECV_AMOUNT)
FROM
        [ZZZ].[dbo].[MRRECVH] H INNER JOIN
        [ZZZ].[dbo].[MRRECVD] D ON H.control  = D.CONTROL
WHERE
        BANK IN (SELECT
                    RIMAS_Code
                 FROM
                    [Custom].[dbo].[Bank_Account])
    AND H.CONTROL = @control
    AND H.CHECK_NUM = @checkno
GROUP BY
        H.CONTROL,
        H.BANK,
        H.NAME,
        H.CHECK_NUM,
        H.RECV_DATE
HAVING
        SUM(D.RECV_AMOUNT) > 0

    IF @@ROWCOUNT > 0   
    SELECT @eligible = 1
END

(在最后一行的下一行,我尝试了'SET @eligible = 1',但这没有任何区别)。

要调用该过程:

DECLARE
    @eligible AS bit

EXECUTE proc_Eligible
    @Control     = '3034'
    ,@Checkno    = '5011'
    ,@event_type = 'update'
    ,@eligible   = @eligible

SELECT @eligible

正如我所提到的,如果我隔离存储过程 SELECT 语句并对变量进行硬编码,它会很好地工作,所以这可能是我的新手在传递数据方面缺乏经验。

(@event_type 稍后将在我将其改编为表触发器时使用)

谢谢你,凯文

4

1 回答 1

5

OUTPUT当您调用存储过程时,您似乎还必须指定关键字:

EXECUTE proc_Eligible
    @Control = '3034'
    ,@Checkno = '5011'
    ,@event_type = 'update'
    ,@eligible = @eligible OUTPUT  -- <--- mark parameter as output
于 2013-10-22T21:35:14.820 回答