4

我有一个 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]”。我不确定为什么它一直失败,任何帮助都会很棒!

******************更新**********

我要疯了。它作为计划作业失败,但在任何其他用户下作为直接查询完美运行。字段如下:

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

无论我尝试什么或做什么,SQL 作业都会失败并出现相同的错误,但这让我很抓狂,我可以自己运行查询并且它可以完美运行。

4

7 回答 7

4

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

于 2014-04-14T09:13:00.887 回答
4

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

编辑:

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

将来您可以通过在任何设置命令(或选择@var = [在此处插入数据])之前执行此错误来解决此错误LEFT([insert data here], #) (# 是该字段的最大长度)。

于 2014-04-16T20:31:14.607 回答
3

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

但是,您会在展示 SQL 结束时注意到:

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

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

-RosSQL

于 2014-04-23T14:11:49.743 回答
2

您是否尝试过设置field2and或代替?field30cast(0 as bit)'0'

于 2014-04-23T16:55:40.003 回答
2

试着在你的工作中注释掉这个陈述,看看这是否有效。从您在编辑中描述的内容来看,定义和分配似乎没问题。

  SELECT @rcount = CAST(@@ROWCOUNT AS VARCHAR(10)) + ' ' + 'row(s) affected by UPDATE';
于 2014-04-23T19:16:33.843 回答
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 被定义为位,但您将它们设置为 char(1)。删除引号并保存隐式类型转换。 WHERE T2.Date >= @startDate AND T2.Date <= @endDate看起来会更好WHERE T2.Date BETWEEN @startDate AND @endDate

于 2014-04-17T06:50:00.430 回答
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';
于 2014-04-13T08:22:59.187 回答