web-dev-qa-db-ja.com

SQLSTATE 42000(エラー102) ')'付近の構文が正しくありません

一般設定

これは奇妙な質問です。申し訳ありません。実際、コードの検索と分析にかなりの時間を費やしました。一部のデータを選択してから他のストアドプロシージャを呼び出すストアドプロシージャを呼び出すジョブがあります(一部の名前は、select-statementsを使用して取得されるため、名前が異なる場合があります)。パラメータを変更するだけで、約20の異なるこれらのストアドプロシージャを約10,000回(さまざまな呼び出しを合計したもの)呼び出します。これらのストアドプロシージャは、一部のデータを取得し、そのデータをデータベースに挿入します。

SQL-Serverのバージョン

これはMicrosoft SQL-Server 2005では問題なく動作しましたが、しばらくしてSQL-Server 2012(11.0.3000.0)にアップグレードし、それ以降この問題が発生し始めているように思われるか、以前は気付かなかっただけです。

エラー

したがって、実行するたびにこのエラーが発生します。

Executed as user: #DATABASEUSER_RMV_FOR_STACKOVERFLOW. Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102)  Incorrect syntax near ')'. 
[SQLSTATE 42000] (Error 102).  The step failed.

これはほんの少しの情報ですが、スクリプトはかなり大きいので、問題を解決するために何をしてくれる人に尋ねたいと思います。

私がこれまでに行ったこと

私はスクリプトを見て、いくつかの予行演習を行いました(b/cスクリプト全体が約1時間実行されます...(毎晩の仕事です))。ドライランはうまくいきました。また、開始ブラケットはほとんどなく、常に閉じています。データを取得するとすぐに、1時間実行すると、このエラーで「クラッシュ」します...

だから私がしたこと:

  • ドライラン(実際にデータをロードせずに、ほとんどのストアドプロシージャを呼び出す)-わかりました、成功
  • Main-store-procedureを直接(ジョブとしてではなく)呼び出した-どちらも機能しなかった
  • ブラケットエラーを検索したコードを確認-ブラケットエラーは見つかりませんでした
  • 別のユーザーで実行:db-admin、私のユーザー-どちらも機能しませんでした
  • Google/Stackoverflow /一般的なstackexchangeを介した少しの検索

質問

スクリプトが実行する必要のあるすべての処理が正しく完全に行われているように見えるため、「成功」を返さずにこのエラーメッセージがスローされる理由を理解できません。

エスケープ文字を含むフィールドが取得される可能性があると想像できます...それは理にかなっていますか?

ユニバーサルブレークポイントのように設定して、この「エラー」が発生するとすぐにスクリプトの実行が中断し、このエラーの原因となっているデータが表示されるようにできますか?Visual Studioでのコードのデバッグのように?

したがって、私の主な質問は次のとおりです。このエラーに最善の方法で対処するためのヒント/ヘルプを教えてください。私は何をすべきですか?


ジョブ

EXEC MY_SCHEME.dbo.MY_STOREDPROCEDURE_MAIN

MY_STOREDPROCEDURE_MAIN

SET NOCOUNT ON;

-- Insert statements for procedure here
DECLARE @userId INT
DECLARE @fullHistory BIT

SELECT @userId = userId
FROM MY_SCHEME.dbo.USERS
WHERE loginname = 'SOME_NAME'

SET @fullHistory = 0

EXECUTE MY_SCHEME.dbo.spStartMyNightlyJob @userId=@userId, @processFullHistory=@fullHistory

spStartMyNightlyJob

PROCEDURE [dbo].[spStartMyNightlyJob]
    @userId INT,
    @processFullHistory BIT
AS
BEGIN
    SET NOCOUNT ON

    DECLARE @logReport VARCHAR(255)
    SET @logReport = 'NightlyJob'

    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('=======================================================================================================', @logReport)
    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('NightlyJob started at ' + CAST(GETDATE() AS VARCHAR), @logReport)
    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('=======================================================================================================', @logReport)

    DECLARE taskCursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR 
        SELECT
            r.taskId, link.Id, i.Description, link.externalId, rdef.name, rdir.fromDB, rdir.toDB,
            rdef.procedureName, rfs.fillStrategyId, rp.parameterId
        FROM MY_TASK r
        LEFT OUTER JOIN some_table_1 link
        ON r.LinkId = link.LinkId
        LEFT OUTER JOIN some_table_2 i
        ON link.Id = i.Id
        LEFT OUTER JOIN some_table_3_TASK_DEFINITION rdef
        ON r.taskDefinitionId = rdef.taskDefinitionId
        LEFT OUTER JOIN some_table_4_TASK_DIRECTION rdir
        ON rdef.directionId = rdir.directionId
        LEFT OUTER JOIN some_table_5_FILL_STRATEGY rfs
        ON rdef.fillStrategyId = rfs.fillStrategyId
        LEFT OUTER JOIN some_table_6_PARAMETER rp
        ON rdef.parameterId = rp.parameterId
        WHERE r.active = 1
        AND rdef.taskDefinitionId NOT LIKE 17


    DECLARE @taskId INT
    DECLARE @someOtherId INT
    DECLARE @someOtherName VARCHAR(255)
    DECLARE @externalSomeOtherId INT
    DECLARE @taskName VARCHAR(50)
    DECLARE @fromDB VARCHAR(50)
    DECLARE @toDB VARCHAR(50)
    DECLARE @storedProcedure VARCHAR(100)
    DECLARE @fillStrategyId INT
    DECLARE @parameterId INT

    OPEN taskCursor
    FETCH NEXT FROM taskCursor
    INTO
        @taskId, @someOtherId , @someOtherName , @externalSomeOtherId , @taskName, @fromDB, @toDB, @storedProcedure,
        @fillStrategyId, @parameterId

    WHILE @@FETCH_STATUS = 0 BEGIN
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('-------------------------------------------------------------------------------------------------------', @logReport)
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('Performing task: ' + @taskName, @logReport)
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('Nightly Job between: ' + @fromDB + ' -> ' + @toDB, @logReport)
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('Executive procedure: ' + @storedProcedure, @logReport)
        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('Involved : ' + @someOtherName + ' (' + CAST(@someOtherId AS VARCHAR) + ')', @logReport)

        EXECUTE @storedProcedure @someOtherId , @externalSomeOtherId , @fillStrategyId, @parameterId, @userId, @processFullHistory

        INSERT INTO TEMP_LOGREPORT (text, report) VALUES('', @logReport)

        SET @taskId = NULL
        SET @someOtherId = NULL
        SET @someOtherName = NULL
        SET @externalSomeOtherId = NULL
        SET @taskName = NULL
        SET @fromDB = NULL
        SET @toDB = NULL
        SET @storedProcedure = NULL
        SET @fillStrategyId = NULL
        SET @parameterId = NULL

        FETCH NEXT FROM taskCursor
        INTO
            @taskId, @taskId , @someOtherName , @externalSomeOtherId , @taskName, @fromDB, @toDB, @storedProcedure,
            @fillStrategyId, @parameterId
    END
    CLOSE taskCursor
    DEALLOCATE taskCursor

    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('=======================================================================================================', @logReport)
    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('NightlyJob finished at ' + CAST(GETDATE() AS VARCHAR), @logReport)
    INSERT INTO TEMP_LOGREPORT (text, report) VALUES('=======================================================================================================', @logReport)
    RETURN 0
END

その後、毎晩「定義」されているタスクに応じて、最大で約15の異なるストアドプロシージャが開きます。

実際の実行をコメントアウトすると

EXECUTE @storedProcedure @someOtherId , @externalSomeOtherId , @fillStrategyId, @parameterId, @userId, @processFullHistory

その後、エラーなしで完了します。

私の質問を見てくれてありがとう;-)

4
skofgar

問題は、2番目のInsertステートメントにあります。古いステートメントをこれに置き換えます。

create table #temp1 (text nvarchar(100),report nvarchar(500))
INSERT INTO #temp1 (text, report) VALUES('NightlyJob started at ' + ''  + CAST(GETDATE() AS VARCHAR) + '','Report')
select * from #temp1