【问题标题】:Stored procedure runs successfully but fails when called from a job存储过程成功运行,但从作业调用时失败
【发布时间】:2015-02-12 16:26:18
【问题描述】:

我在 SQL 中遇到了一个非常奇怪的错误,我需要一些帮助。下面的代码创建了此报告所需的两个存储过程:

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),存储过程在从查询中调用时可以正常工作,但在从作业中调用时失败。

谢谢

【问题讨论】:

  • CUSTOMER_ORDER 表的架构是什么?
  • @RafaelSampaio 他说“模式”只是表的列名和数据类型,而不是您刚刚转储的所有信息。如ID int, Status char(1)...
  • @SoulTrain 架构是 ID varchar(15),STATUS char(1),感谢您澄清
  • 感谢您的信息。一切看起来都井井有条。为了安全起见,您能否在插入语句中指定列名。点赞INSERT INTO [ONDT_OPS_OTD_SMARTVIEW] ( [ID] ,[STATUS]) SELECT [ID] ,[STATUS] FROM [CUSTOMER_ORDER] WHERE [STATUS] = 'H'; 看看有没有帮助

标签: sql sql-server stored-procedures sql-agent-job sql-job


【解决方案1】:

经过一番挣扎,我找到了罪魁祸首。事实证明,SQL 不喜欢运行该作业的用户名长度超过 50 个字符的事实。当我添加时查询工作正常:

作为用户执行 = 'sysadm'

这是我的 SQL 管理员帐户(与域帐户相同的权限)。希望这将使某人免于它给我带来的头痛。

感谢所有提供帮助的人,你们很棒。

问候,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2021-11-23
    • 1970-01-01
    • 2018-10-20
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多