2013-10-22 72 views
2

要容易对我...还是一个新手T-SQL程序员:)T-SQL存储过程传递输入,输出采用

我有打算采用三个输入参数,分析和存储过程发回一个参数(@资格)。如果我只是用硬编码的变量执行T-SQL脚本,我的@@ ROWCOUNT会将@eligible设置为1.当我将它作为存储过程EXECUTE调用时,它不会正确返回@资格。下面是该过程:

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稍后会用到,当我适应这个到表触发器)

谢谢 凯文

+0

你的意思是,如果你对自己的运行选择具有硬编码值,而不是返回至少一个行变量,但如果你调用进程内传递的参数相同的值,结果集是空的? – acfrancis

回答

5

看来你必须指定OUTPUT关键字为好,当你打电话给你的存储PROC:

EXECUTE proc_Eligible 
    @Control = '3034' 
    ,@Checkno = '5011' 
    ,@event_type = 'update' 
    ,@eligible = @eligible OUTPUT -- <--- mark parameter as output 
+0

谢谢!我发誓我尝试过,但是随着很多编程的发展(我已经做了多年,只是没有用这种语言),它往往是事物的组合。 GettingStrongerEveryDay