0

私は現在、EntityFrameworkのストアドプロシージャを使用してシーケンスを生成するプロジェクトに取り組んでいます。ここでCodeProjectの記事を使用していましたが、次のストアドプロシージャを生成しようとすると、構文エラーが発生しました。

SET QUOTED_IDENTIFIER OFF

GO 
SET ANSI_NULLS OFF
GO 

CREATE PROCEDURE DBO.p_GetNextInSequence 
    @SequenceKey VARCHAR(20)
AS 
BEGIN 
SET NOCOUNT ON 
DECLARE @LASTNUMBER INT
DECLARE @NEXTNUMBER INT
DECLARE @FORMATTEDNUMBER VARCHAR(40)
DECLARE @MYKEY VARCHAR(30)

IF NOT EXISTS(SELECT 'X' 
              FROM SequenceControl 
              WHERE SequenceControl.SequenceKey = @SequenceKey )
BEGIN 
    SELECT    @SequenceKey AS SequenceKey, 
              CAST('' AS VARCHAR(30)) AS NextSequenceFormatted, 
              CAST(0 AS INT) AS NextSequenceInt 
    RETURN 
END 

DECLARE @SEQFORMAT VARCHAR(30), @IncrementBy INT, 
                   @IncrementStep INT, @zeropadtodigits INT

SELECT @SEQFORMAT = RTRIM(LTRIM(SequenceFormat)),
       @IncrementBy = IncrementBy, 
       @zeropadtodigits = ZeroPadToDigits 
FROM    SequenceControl 
WHERE    SequenceControl.SequenceKey = @SequenceKey 

DECLARE @THEROWCOUNT INT 
SET @THEROWCOUNT    = 0 

BEGIN TRANSACTION T1
    WHILE ( @THEROWCOUNT =0 ) 
    BEGIN 
        SELECT   @LASTNUMBER= LastSequence 
        FROM     SequenceControl
        WHERE    SequenceControl.SequenceKey= @SequenceKey 

        UPDATE     SequenceControl 
        SET        LastSequence = @LASTNUMBER + @IncrementBy 
        WHERE      SequenceKey = @SequenceKey AND    
                   LastSequence = @LASTNUMBER 

        SELECT @THEROWCOUNT = @@ROWCOUNT
    END 
COMMIT TRANSACTION T1 

--SQL Complains near this region...
DECLARE @FMTNUM VARCHAR(20) 
SET @NEXTNUMBER = @LASTNUMBER + @IncrementBy 
IF ( @zeropadtodigits>0) 
    SET @FMTNUM = ( REPLICATE('0', @zeropadtodigits) + 
                    CAST(@NEXTNUMBER AS VARCHAR(20)), @zeropadtodigits) 
ELSE 
    SET @FMTNUM = CAST(@NEXTNUMBER AS VARCHAR(10)) 


SET @FORMATTEDNUMBER = REPLACE(@SEQFORMAT,'[#]', @FMTNUM ) 

SELECT    @SequenceKey AS SequenceKey, 
          CAST(@FORMATTEDNUMBER AS VARCHAR(30)) AS NextSequenceFormatted, 
          @NEXTNUMBER AS NextSequenceInt 
END 

GO 
SET QUOTED_IDENTIFIER OFF
GO 
SET ANSI_NULLS ON    
GO

','SQLは、 56行目付近の構文が正しくないことについて不平を言っています。

DECLARE @FMTNUM VARCHAR(20) 

ただし、問題の原因がどこにあるのか、何が原因なのかがわかりません。また、Entity Framework内でのストアドプロシージャの使用(および出力の返し)に関する提案や記事があれば、感謝します。

4

2 に答える 2

3

実際のエラーは次のとおりです。

IF ( @zeropadtodigits>0) 
    SET @FMTNUM = ( REPLICATE('0', @zeropadtodigits) + 
                    CAST(@NEXTNUMBER AS VARCHAR(20)), @zeropadtodigits) 

より具体的には、ここで:

, @zeropadtodigits)

そのコンマは何もしませんし、何に@zeropadtodigitsも当てはまりません。括弧内のパラメータとしてそれを使用する関数はありません。

于 2012-04-18T16:17:14.973 に答える
1

構文は実際には次のように爆発しています。

SET @FMTNUM = ( REPLICATE('0', @zeropadtodigits) + 
                CAST(@NEXTNUMBER AS VARCHAR(20)), @zeropadtodigits) 

なぜ他の行に文句を言っているのか、私にはわかりません。

于 2012-04-18T16:24:29.960 に答える