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(notbigintまたは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 PROCのみが返される場合があります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 から)。

@sNewInventoryPackNumを返すのではなく、 as a resultを選択します。これは、呼び出し元が使用できるスカラーの結果セットになります (たとえば、ADO で Scalar として取得します.ExecuteScalar) 。

NVARCHAR戻り値でUDF使用する

余談ですが、あなたの大部分はPROC、固定文字列幅を維持するために先行ゼロでパディングすることに関心があるようです。STUFFこの IMO を達成するためのより洗練された方法を提供するを使用するなど、いくつかの代替手段があります。

于 2013-11-03T09:00:16.857 に答える