2016-10-03 9 views
0

テーブルtblidsetは最初の実行時に何も含まれていません、私はこのストアドプロシージャを私のコードで初めて呼び出すと、それを構築するためにテーブルから最高の値を取得する必要があります後でプログラムデータが大きくなるにつれて値が大きくなります。バグの問題は、最初の実行時に常に0を返すということです。数時間頑張ってしまった。手伝ってもらえますか?ここにスクリプトがあります:私のストアドプロシージャ常に返す0

CREATE PROCEDURE CREATENEWID 
@TYPE AS INT 
AS 
BEGIN 

DECLARE @CNT AS INT; 
DECLARE @DOCNO AS BIGINT; 
DECLARE @DOCID AS BIGINT; 
SELECT @CNT = ISNULL(COUNT(*),0) FROM TBLIDSET 

--CHECK IF THERE IS NO VALUE AS OF DATE AND INSERT DEFAULT VALUES 
    IF @CNT = 0 

    BEGIN 

     INSERT INTO TBLIDSET SELECT TOP 1(DOCID),0 FROM INVHDR ORDER BY DOCID DESC 
    END 
    DECLARE @NUM AS INT; 
    IF @TYPE = 1 
     BEGIN 
      UPDATE TBLIDSET SET DOCID = DOCID +1 
      SELECT @NUM = DOCID FROM TBLIDSET 
     END 
    ELSE 
     BEGIN 
      UPDATE TBLIDSET SET DOCNO = DOCNO + 1 
      SELECT @NUM = DOCNO FROM TBLIDSET 
    END 
    PRINT @NUM 
    RETURN @NUM 

END 
GO 
+1

タイプパラメータにはどのようなものがありますか? – Steve

+0

'MAX + 1'をIDとして使用すると、重複した値が簡単に出る可能性があるため、*問題*となります。また、このコードは* maximum * IDを探しません。乱数を返します。 'SELECT @NUM = TBLIDSETからのDOCID'は、基になる値の* any *を返すかもしれません。 –

+0

独自のシーケンスを生成するのではなく、SQL Serverの[SEQUENCE](https://msdn.microsoft.com/en-us/library) /ff878058.aspx)機能は、SQL Server 2012以降で使用できます。どのバージョンを使用していますか? –

答えて

0

このコードを試してください。あなたのコードに出力パラメータを追加します。

CREATE PROCEDURE CREATENEWID 
@TYPE AS INT, 
@NUM AS INT OUT --Declare ouput parameter here 
AS 
BEGIN 

DECLARE @CNT AS INT; 
DECLARE @DOCNO AS BIGINT; 
DECLARE @DOCID AS BIGINT; 
SELECT @CNT = ISNULL(COUNT(*),0) FROM TBLIDSET 

--CHECK IF THERE IS NO VALUE AS OF DATE AND INSERT DEFAULT VALUES 
    IF @CNT = 0 

    BEGIN 

     INSERT INTO TBLIDSET SELECT TOP 1(DOCID),0 FROM INVHDR ORDER BY DOCID DESC 
    END 
    --Move your @NUM to output parameter 
    IF @TYPE = 1 
     BEGIN 
      UPDATE TBLIDSET SET DOCID = DOCID +1 
      SELECT @NUM = DOCID FROM TBLIDSET 
     END 
    ELSE 
     BEGIN 
      UPDATE TBLIDSET SET DOCNO = DOCNO + 1 
      SELECT @NUM = DOCNO FROM TBLIDSET 
    END 
    PRINT @NUM 
    RETURN @NUM 

END 
GO 
+0

どうしてそれが違いますか? 'RETURN'は壊れていません。 '@ NUM'が値' RETURN'を持っていればそれを返します。 –

+0

彼の最初の実行結果は実行結果コードだと思います。 0は成功です。私はOUTパラメータで彼を助けたいと思います。 –

関連する問題