2

我正在尝试构建一个返回 nvarchar 值的过程。在我尝试从过程中获取价值之前,它似乎工作正常。这是我的程序中的所有代码:

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。我很确定我必须更改一些小东西,但是你能告诉我什么吗?

4

2 回答 2

4

SQL Server 只允许返回int(not bigintor varchar)。而是使用输出参数。

http://www.toadworld.com/platforms/sql-server/w/wiki/10261.stored-procedures-output-parameters-return-values.aspx

于 2013-11-03T08:40:28.697 回答
1

只是为了扩展@PaulDraper 和 OzrenTkalcec 所说的内容,Sql PROCs 可能只会返回INT

因此,当您返回 NVARCHAR 时,SQL 正试图将其转换为 INT,这会溢出(如果返回值足够小以适合 ,则此过程之前可能已正常工作INT,例如 的值较小@PartNumber

你有几个选择:

绑定输出变量

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

然后SET @sNewInventoryPackNum = @sPartNumber + @StringNum + '10'将是 PROC 的最后一行。然后调用者需要绑定到输出参数(例如ParameterDirection.Output来自 ADO)

选择@sNewInventoryPackNumas 结果,而不是返回它。这将是调用者可用的标量结果集(例如,在 ADO 中检索为 Scalar .ExecuteScalar

使用带有NVARCHAR返回值的UDF

顺便说一句,您的主要部分似乎PROC关心用前导零填充以保持固定的字符串宽度。有几种替代方法,例如 using STUFF,它们提供了更优雅的方式来实现此 IMO。

于 2013-11-03T09:00:16.857 回答