2013-11-03 61 views
2

我試圖構建一個返回nvarchar值的過程。 它似乎工作得很好,直到我試圖從程序中獲得價值。 這是從我的過程中的所有代碼:SQL中的返回值爲空

ALTER PROCEDURE [dbo].[_MG_NextInventoryPackNumberForPartNumber] 
@sPartNumber NVARCHAR(254) --##PARAM @sPartNumber The part number for which we need to get the new InventoryPackNo 
AS 
BEGIN 

SET NOCOUNT ON; 

DECLARE @num INT, 
    @sNewInventoryPackNum NVARCHAR(254), 
    @StringNum NVARCHAR(254) 
SET @StringNum = (SELECT SUBSTRING(InventoryPackNo, 9, 5) AS pName 
        FROM  InventoryPack 
        WHERE  SUBSTRING(InventoryPackNo, 1, 8) LIKE @sPartNumber) 
SET @num = CONVERT(INT, @StringNum) 
SET @num = @num + 1 
IF @num >= 1 AND @num <= 9 
    BEGIN 
     SET @StringNum = CONVERT(NVARCHAR(254), @num) 
     SET @StringNum = '0000' + @StringNum 
    END 
IF @num >= 10 AND @num <= 99 
    BEGIN 
     SET @StringNum = CONVERT(NVARCHAR(254), @num) 
     SET @StringNum = '000' + @StringNum 
    END 
IF @num >= 100 AND @num <= 999 
    BEGIN 
     SET @StringNum = CONVERT(NVARCHAR(254), @num) 
     SET @StringNum = '00' + @StringNum 
    END 
IF @num >= 1000 AND @num <= 9999 
    BEGIN 
     SET @StringNum = CONVERT(NVARCHAR(254), @num) 
     SET @StringNum = '0' + @StringNum 
    END 
IF @num >= 10000 AND @num <= 99999 
    BEGIN 
     SET @StringNum = CONVERT(NVARCHAR(254), @num) 
    END 
IF @num = 100000 
    BEGIN 
     SET @StringNum = '00000' 
    END 
SET @sNewInventoryPackNum = @sPartNumber + @StringNum + '10' 
PRINT @sNewInventoryPackNum 
RETURN @sNewInventoryPackNum 
END 

這是我嘗試調用的程序:

DECLARE @sNuwNum NVARCHAR(254) 
EXEC @sNuwNum = _MG_NextInventoryPackNumberForPartNumber '77510002' 
PRINT @sNuwNum 

的程序應該返回這個值:775100020000210.但所有我在控制檯中看到屏幕部分是這樣的:

775100020000210 
Msg 248, Level 16, State 1, Procedure _MG_NextInventoryPackNumberForPartNumber, Line 51 
The conversion of the nvarchar value '775100020000210' overflowed an int column. 
The '_MG_NextInventoryPackNumberForPartNumber' procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead. 
0 

我使用的是SQL Server 2008的 我敢肯定,我要改變的東西小,但是你能不能認罪你告訴我什麼?

+2

幾乎重複:[here](http://stackoverflow.com/questions/9837481/return-value-in-sql-server-stored-procedure)。 SQL Server始終返回int作爲返回值。爲此,請使用函數(UDF)。 – OzrenTkalcecKrznaric

+1

重複的答案,也許。該問題的OP沒有明確的「RETURN」。 –

回答

1

只是當你返回一個nvarchar SQL試圖將其轉換爲int,它被溢出到什麼@PaulDraper和OzrenTkalcec這麼說擴大,Sql PROCs may only return INT

(這是可能的,這程序是否正確之前,如果返回值已經足夠小,以適應加工成INT,例如與@PartNumber一個很小的值)

您有幾種選擇:

綁定一個輸出變量

ALTER PROCEDURE [dbo].[_MG_NextInventoryPackNumberForPartNumber] 
    @sPartNumber NVARCHAR(254), 
    @sNewInventoryPackNum NVARCHAR(254) OUTPUT 
AS 
... 

然後SET @sNewInventoryPackNum = @sPartNumber + @StringNum + '10'將是PROC的最後一行。然後呼叫者將需要綁定到輸出參數(例如,來自ADO ParameterDirection.Output

選擇@sNewInventoryPackNum結果,而不是返回它。那麼這將是給調用者提供一個標結果集(例如,在ADO檢索作爲標.ExecuteScalar

使用UDFNVARCHAR返回值

順便說一句,看來的重要組成部分你的PROC是關注填充與前導零以保持固定的字符串寬度。有幾種可供選擇的方案,例如使用STUFF,它們提供了更加優雅的實現這種IMO的方法。