首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在sql过程中返回值为空。

在sql过程中返回值为空。
EN

Stack Overflow用户
提问于 2013-11-03 08:33:23
回答 2查看 1.5K关注 0票数 2

我试图构建一个返回nvarchar值的过程。在我试图从这个过程中得到价值之前,它似乎运转良好。以下是我程序中的所有代码:

代码语言:javascript
运行
复制
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

我试着把这个程序叫做:

代码语言:javascript
运行
复制
DECLARE @sNuwNum NVARCHAR(254)
EXEC @sNuwNum = _MG_NextInventoryPackNumberForPartNumber '77510002'
PRINT @sNuwNum

该过程应该返回这个值: 775100020000210。但是我在屏幕的控制台部分看到的是:

代码语言:javascript
运行
复制
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

我正在使用server 2008。我很确定我得换点小东西,但你能告诉我什么吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-03 08:40:28

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

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

票数 4
EN

Stack Overflow用户

发布于 2013-11-03 09:00:16

仅仅是为了详述@PaulDraper和OzrenTkalcec所说的话,INT

因此,当您返回一个NVARCHAR试图将其转换为INT时,它已经溢出(如果返回值已经足够小到适合于INT (例如,@PartNumber的一个小值),则此过程以前可能正确工作)。

你有几种选择:

绑定输出变量

代码语言:javascript
运行
复制
 ALTER PROCEDURE [dbo].[_MG_NextInventoryPackNumberForPartNumber]
    @sPartNumber NVARCHAR(254),
    @sNewInventoryPackNum NVARCHAR(254) OUTPUT
 AS 
 ...

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

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

使用带有NVARCHAR返回值的 UDF

顺便说一句,您的PROC的主要部分似乎与填充前导零以保持固定的字符串宽度有关。有几种选择,例如使用STUFF,这为实现这一目标提供了更优雅的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19751154

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档