2013-08-29 70 views
5

我的存储过程返回期望值,但OUT参数不返回任何内容。在过程退出之前打印out参数的值,该参数的值被设置并且看起来很棒。那么为什么我的测试代码没有得到任何价值呢?存储过程OUT参数总是返回NULL

USE MyDB 
GO 
EXECUTE sp_addmessage 
    @msgnum = 51001, 
    @severity = 16, 
    @msgtext = N'Resource NOT Available', 
    @lang  = 'us_english', 
    @replace = REPLACE 
GO 

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetNewFileNumber]') AND type in (N'P', N'PC')) 
DROP PROCEDURE [dbo].[GetNewFileNumber] 
GO 


CREATE PROCEDURE dbo.GetNewFileNumber 
    (
     @NextFileNum nvarchar(11) = NULL output 
    ) 
AS 
BEGIN 

    set transaction isolation level serializable 
    begin transaction 

    declare @LockResult int; 
    declare @CurrentDate date; 
    declare @FileNumberDate date; 
    declare @FileNumber int; 

    execute @LockResult = sp_getapplock 
     @Resource = 'GetNewFileNumber_TRANSACTION', 
     @LockMode = 'Exclusive', 
     @LockTimeout = 0 
    if @LockResult <> 0 
    begin 
     rollback transaction 
     raiserror (51001, 16, 1) 
     return 
    end 


     set @CurrentDate = CONVERT (date, GETUTCDATE()); 

    select @FileNumberDate = filedate, 
     @FileNumber = fileCount from dbo._globalCounters; 
    if @FileNumberDate != @CurrentDate 
    begin 
     set @FileNumberDate = @CurrentDate; 
     set @FileNumber = 0; 
    end 

    set @FileNumber = @FileNumber + 1; 
    update dbo._globalCounters 
     set fileDate = @FileNumberDate, fileCount = @FileNumber; 

    set @NextFileNum = convert(nvarchar(6), @FileNumberDate, 12) + 
     '-' + 
     RIGHT('00'+convert(nvarchar(2), @FileNumber),2); 

    execute sp_releaseapplock 'GetNewFileNumber_TRANSACTION' 

    commit transaction 
    print 'filenum:' + @NextFileNum  
    return @FileNumber; 
END 

GO 

--Test the procedure 
DECLARE @return_value int 
DECLARE @out_value nvarchar(11) 
EXEC @return_value = [dbo].[GetNewFileNumber] @out_value 
SELECT 'Return Value' = @return_value, 'Out Value' = @out_value -- Out value always  returns null?! 
GO 

回答

17

你需要的时候你怎么称呼它

EXEC @return_value = [dbo].[GetNewFileNumber] @out_value OUTPUT 
+4

我爱你,我的英雄。 – Constablebrew

0

我有同样的问题,将其标记为输出参数。事实证明,我的输入NVARCHAR参数之一是NULL。当添加到输出参数NVARCHAR时,它将整个参数设置为NULL。奇怪的是 。 如果将它们添加到NVARCHAR输出参数中,请检查您的输入参数。 我在这上面花了很长时间!