2013-08-29 32 views
5

thủ tục lưu trữ của tôi trả về giá trị dự kiến, nhưng tham số OUT không trả lại bất cứ điều gì. In giá trị của tham số ngoài ngay trước khi thoát khỏi thủ tục, giá trị của tham số được đặt và trông tuyệt vời. Vậy tại sao mã thử nghiệm của tôi không nhận được bất kỳ giá trị nào?Lưu trữ thủ tục OUT tham số luôn luôn trở về 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 

Trả lời

17

Bạn cần phải đánh dấu nó như là một tham số đầu ra khi bạn gọi nó

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

Tôi yêu bạn, anh hùng của tôi. – Constablebrew

0

tôi đã cùng một vấn đề. Hóa ra là một trong các tham số NVARCHAR đầu vào của tôi là NULL. Khi được thêm vào tham số đầu ra NVARCHAR, nó đặt toàn bộ tham số thành NULL. Kỳ lạ. Kiểm tra thông số đầu vào của bạn nếu thêm chúng vào tham số đầu ra NVARCHAR. Tôi đã dành khá nhiều thời gian cho việc này!