【问题标题】:null in return value in sql proceduresql过程中的返回值为null
【发布时间】:2013-11-14 02:14:53
【问题描述】:

我正在尝试构建一个返回 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。 我很确定我必须改变一些小东西,但是你能告诉我什么吗?

【问题讨论】:

  • 几乎重复:here。 SQL Server 总是返回 int 作为返回值。为此,请使用函数 (UDF)。
  • 可能是重复的答案。该问题的 OP 没有明确的 RETURN

标签: sql-server stored-procedures null return-value


【解决方案1】:

只是为了扩展 @PaulDraper 和 OzrenTkalcec 所说的话,Sql PROCs may only return 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 的最后一行。然后调用者需要绑定到输出参数(例如来自 ADO 的 ParameterDirection.Output

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

使用 UDFNVARCHAR 返回值

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

【讨论】:

    【解决方案2】:

    SQL Server 只允许返回 int(而不是 bigintvarchar)。而是使用输出参数。

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

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多