2

SQL で非常に奇妙なエラーが発生したので、助けを求めています。以下のコードは、このレポートに必要な 2 つのストアド プロシージャを作成します。

USE [ONDTTEST]

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE ONDT_OPS_OTD_STEP1 
AS
    BEGIN
        SET NOCOUNT ON;

        /** Create Table **/
        CREATE TABLE ONDT_OPS_OTD_SMARTVIEW
        (
            ID      varchar(15) NOT NULL,
            STATUS  char(1) NOT NULL
        );

        /** Insert data into table **/
        INSERT INTO      [ONDT_OPS_OTD_SMARTVIEW]
        SELECT           [ID]
                        ,[STATUS]
        FROM             [CUSTOMER_ORDER]
        WHERE            [STATUS] = 'H';

        /** Update customer order table from H to R **/
        UPDATE           [CUSTOMER_ORDER]
        SET              [STATUS] = 'R'
        WHERE            [STATUS] = 'H';
    END
GO

CREATE PROCEDURE ONDT_OPS_OTD_STEP2 
AS
    BEGIN
        SET NOCOUNT ON;

        /** Update records back to H **/
        UPDATE  [CUSTOMER_ORDER]
        SET     [STATUS] = 'H'
        WHERE   [ID] IN (SELECT [ID] FROM [ONDT_OPS_OTD_SMARTVIEW]);

        /** Drop Table **/
        DROP TABLE ONDT_OPS_OTD_SMARTVIEW;
    END
GO

両方のストアド プロシージャを実行すると正常に実行されますが、スケジュールされたジョブからストアド プロシージャを呼び出すと、次のエラーが発生します。

Executed as user: admin. String or binary data would be truncated. [SQLSTATE 22001] (Error 8152)  The statement has been terminated. [SQLSTATE 01000] (Error 3621).  The step failed.

プロファイラーを実行したところ、両方のプロシージャーで CUSTOMER_ORDER テーブルへの更新ステップで失敗することがわかりました。Status 列は char(1) として設定され、ストアド プロシージャはクエリから呼び出されると正しく動作しますが、ジョブから呼び出されると失敗します。

ありがとう

4

1 に答える 1

0

悪戦苦闘の末、犯人を発見。SQL は、ジョブを実行するユーザー名が 50 文字を超えることを好まないことがわかりました。追加すると、クエリは正常に機能します。

EXEC AS USER = 'sysadm'

これは私の SQL 管理者アカウントです (ドメイン 1 と同じ権限)。うまくいけば、これが私を引き起こした頭痛から誰かを救うでしょう.

助けてくれたみんなに感謝します。あなたたちは素晴らしいです。

よろしく、

于 2015-02-15T16:39:38.530 に答える