为什么我的SQL代理作业会一直失败?

时间:2014-04-12 20:38:51

标签: sql-server-2008 tsql sql-agent-job

我有一个SQL代理作业,只按计划运行基本查询。它根据显示的查询更新信息。

USE DB
DECLARE @startDate AS DATETIME
DECLARE @endDate AS DATETIME
DECLARE @rcount AS VARCHAR(10)
SET @startDate = CAST(CONVERT(VARCHAR(10),GETDATE(),112) AS DATETIME) 
SET @endDate = CAST(CONVERT(VARCHAR(10),GETDATE(),112) AS DATETIME) 
--*********************************************************
-- *Run Query
--*********************************************************
UPDATE Table1
SET Table1.field1 = 'ZPR' +  Left(Table1.field1,6),
    Table1.field2 = '0',
    Table1.field3 = '0' 
WHERE  Table1.GUID IN (SELECT GUID FROM Table1 T2 
    WHERE T2.Date >= @startDate 
        AND T2.Date <= @endDate 
        AND   T2.complete = 0)
    AND Table1.co IN (SELECT co FROM VIEW('ZERO')) 
SELECT @rcount = CAST(@@ROWCOUNT AS VARCHAR(10)) + ' ' + 'row(s) affected by UPDATE';
--*********************************************************
--* Print Results
--*********************************************************
DECLARE @eSubject varchar(250)
DECLARE @emailTo varchar(250)
SET @eSubject = 'Number of rows updated'   
SET @emailTo = 'me@me.com' 
EXEC msdb.dbo.sp_send_dbmail @recipients=@emailTo,
    @subject = @eSubject,
    @body = @rcount,
    @body_format = 'HTML';

当没有进行任何更新时,作业会完美运行,但只要有任何更新就会失败。运行此作业的用户具有读写访问权限。我得到的错误是“字符串或二进制数据将被截断[sql220001] [错误8152]”。我不确定为什么它会一直失败,任何帮助都会令人惊叹!

****************** UPDATE **********

我在这里疯了。它作为预定作业失败,但作为直接查询在任何其他用户下完美运行。这些字段是这样的:

Table1.field1 = PK长度为10 Table1.field2 =位长度为1 Table1.field3 =位长度为1

无论我尝试做什么或做什么SQL作业失败都有相同的错误,但它让我疯狂,我可以自己运行查询,它完美无瑕。

7 个答案:

答案 0 :(得分:4)

也许在Table1上设置了一些触发器导致问题?如果有,你也应该检查那些代码。

答案 1 :(得分:4)

尝试将@rcount更改为varchar(50)。我认为就是问题。

修改

由于我的第一个建议没有解决您的问题,请在您的桌面上查找触发器。如果正在运行的触发器尝试将50个字符放入varchar(25)字段,它也可能会给您带来错误。

您可以在以后通过任何set命令(或选择@var = [此处插入数据])来执行此错误,执行LEFT([insert data here], #)(#是该字段的最大长度)。< / p>

答案 2 :(得分:3)

您的变量@rcount设置为10的最大大小。例如VARCHAR(10)

但是你会在你的节目SQL结束时注意到:

SELECT @rcount = CAST(@@ROWCOUNT AS VARCHAR(10)) + ' ' + 'row(s) affected by UPDATE';

这至少是最大尺寸的两倍。您可以尝试将@rcount增加到更大的VARCHAR

-RosSQL

答案 3 :(得分:2)

判断查询。每次向运行添加一个语句,以确保您知道完全它正在抱怨哪个位。确保使用作业将使用的凭据运行它。

第一

USE DB
DECLARE @startDate AS DATETIME
DECLARE @endDate AS DATETIME
DECLARE @rcount AS VARCHAR(10)
SET @startDate = CAST(CONVERT(VARCHAR(10),GETDATE(),112) AS DATETIME) 
SET @endDate = CAST(CONVERT(VARCHAR(10),GETDATE(),112) AS DATETIME) 

然后

USE DB
DECLARE @startDate AS DATETIME
DECLARE @endDate AS DATETIME
DECLARE @rcount AS VARCHAR(10)
SET @startDate = CAST(CONVERT(VARCHAR(10),GETDATE(),112) AS DATETIME) 
SET @endDate = CAST(CONVERT(VARCHAR(10),GETDATE(),112) AS DATETIME) 
--*********************************************************
-- *Run Query
--*********************************************************
UPDATE Table1
SET Table1.field1 = 'ZPR' +  Left(Table1.field1,6),
    Table1.field2 = '0',
    Table1.field3 = '0' 
WHERE  Table1.GUID IN (SELECT GUID FROM Table1 T2 
    WHERE T2.Date >= @startDate 
        AND T2.Date <= @endDate 
        AND   T2.complete = 0)
    AND Table1.co IN (SELECT co FROM VIEW('ZERO'))

等。直到你确切知道哪个部分抛出异常。

我假设它将是UPDATE Table1声明。开始解剖。运行它一次只更新field1,然后更新field1和field2等。同样在你的子选择中 - 删除所有子句并一次添加一个,直到它中断。

我最好的猜测 - 您和正在运行的作业凭据具有不同的默认架构。优化器正在为您和作业使用不同的对象集。我的猜测是你的Table1.field1与作业的Table1.field1的长度不同。修复方法是在对象引用前加上模式UPDATE dbo.Table1。在每个语句中都是最佳实践。

另外,field2和field3被定义为bit,但是你将它们设置为char(1)。删除引号并保存隐式类型转换。 WHERE T2.Date >= @startDate AND T2.Date <= @endDate看起来会更好WHERE T2.Date BETWEEN @startDate AND @endDate

答案 4 :(得分:2)

您是否尝试过将field2field3设为0cast(0 as bit)而不是'0'

答案 5 :(得分:2)

尝试在您的工作中评论此声明,看看是否有效。根据您在编辑中描述的内容,似乎定义和分配都可以。

  SELECT @rcount = CAST(@@ROWCOUNT AS VARCHAR(10)) + ' ' + 'row(s) affected by UPDATE';

答案 6 :(得分:1)

我做了一些小的调整,可能会导致问题或混淆SQL。我还假设Field3实际上是数字(int等)。同时确认View('zero')的输出是数字或不导致截断:

USE database
DECLARE @startDate AS DATE
DECLARE @endDate AS DATE
DECLARE @rcount AS VARCHAR(MAX)
SET @startDate = GETDATE()
SET @endDate = GETDATE()
--*********************************************************
--* Query
--*********************************************************
UPDATE Table1
SET Table1.field = 'ZPR' +  Left(isnull(Table1.field,''), 7)
WHERE  Table1.field2 IN (SELECT left(isnull(field,''),10) FROM Table2 T2 
    WHERE T2.Date >= @startDate 
        AND T2.Date <= @endDate 
        AND   T2.field3 = 0)
    AND Table1.field3 IN (SELECT field FROM VIEW('ZERO')) 
SELECT @rcount = CAST(@@ROWCOUNT AS NVARCHAR(10)) + ' ' + 'row(s) affected by UPDATE';
--*********************************************************
--* Print Results
--*********************************************************
DECLARE @eSubject varchar(250)
DECLARE @emailTo varchar(250)
SET @eSubject = 'here is your email'   
SET @emailTo = 'me@me.com' 
EXEC msdb.dbo.sp_send_dbmail @recipients=@emailTo,
    @subject = @eSubject,
    @body = @rcount,
    @body_format = 'HTML';