我有一个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作业失败都有相同的错误,但它让我疯狂,我可以自己运行查询,它完美无瑕。
答案 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)
您是否尝试过将field2
和field3
设为0
或cast(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';