Sql server 我怎样才能避免;警告:字符串或二进制数据将被截断;在SQL工作中给我一个失败
我已经看过了,但我所看到和尝试过的解决方案都没有真正解决我的问题 背景:使用SQLServer2005 当我运行存储过程将数据插入表时,它工作正常。如果我得到一个SQL作业,在相同的数据上运行相同的存储过程,则该作业会成功运行,但数据不会插入到相同的目标表中 我尝试过将ansi\U警告设置为OFF,但编译SQL时出错,原因是 异构查询要求为连接设置ANSI_NULLS和ANSI_WARNINGS选项。这确保了一致的查询语义。启用这些选项,然后重新发出查询 表架构:Sql server 我怎样才能避免;警告:字符串或二进制数据将被截断;在SQL工作中给我一个失败,sql-server,sql-server-2005,stored-procedures,Sql Server,Sql Server 2005,Stored Procedures,我已经看过了,但我所看到和尝试过的解决方案都没有真正解决我的问题 背景:使用SQLServer2005 当我运行存储过程将数据插入表时,它工作正常。如果我得到一个SQL作业,在相同的数据上运行相同的存储过程,则该作业会成功运行,但数据不会插入到相同的目标表中 我尝试过将ansi\U警告设置为OFF,但编译SQL时出错,原因是 异构查询要求为连接设置ANSI_NULLS和ANSI_WARNINGS选项。这确保了一致的查询语义。启用这些选项,然后重新发出查询 表架构: [JobNo] [int]
[JobNo] [int]
[ProductCode] [varchar](20)
[ProductName] [varchar](200)
[ReportedAvailability] [varchar](100)
[ReportedProductClean] [varchar](100)
[ReportedProductDate] [varchar](100)
[ReportedProductPrice] [int]
[ReportedCasesOrdered] [int]
[AvailableYes] [int]
[AvailableOOS] [int]
[AvailableNotRanged]
[ProductClean] [int]
[ProductInDate] [int]
[ProductPrice] [int]
[CasesOrdered] [int]
[Include] [int]
[Counter] [int]
[UserId] [varchar](10)
[Modified] [datetime]
在游标中,insert语句周围有一个try/catch,因此当它一个接一个地处理作业时,如果有问题,我确切地知道它在哪个作业上失败了,因为有一个update语句可以说“完成”,如果可以,则说“失败”
我在此表中输入的所有数据都足够短,可以放入require列(即,产品名称少于200个字符,INT值小于等于5位)
我收到了一个警告,不是错误,但我无法理解为什么它在作为SQL作业运行时会导致合法记录失败,而在作为独立SP运行时却不会
目标表上没有触发器,INT列上有一些默认为0的约束(但我没有想到这会是问题所在。同一SP中的其他表没有这个问题)
提前感谢信息非常有限,因此无法得出结论。如果您在默认的查询窗口连接上说,您可以在没有任何问题的情况下执行,因此设置可以在一个方面进行更改。在对表插入之前,您不能将所有这些值赋给某些变量吗。将值设置为变量将有助于自动截断到指定的变量长度,并且可以避免错误在运行作业或直接存储过程时不应出现任何错误,除非作业中存在导致某些数据比预期长的逻辑。我使用了这么多的作业和存储过程,但我从未遇到过这样的错误。从开发人员的角度来看,只有在以下情况下才会发生作业中的错误:1)执行帐户失败或缺少访问权限,2)执行存储过程确实有错误用户ID的数据是什么?如果是当前用户,则SQL代理运行的帐户可能比您的用户帐户长。您可能正试图在
varchar(100)
中的一个varchar(101+)
中插入一个varchar(11+)
,或者在UserId
列中插入一个varchar(11+)
。一个简单(/ught)的修复方法是自己截断数据,例如插入left(src.UserId,10)
,而不是只插入src.UserId
。检查运行SQL作业的帐户的权限。当有人对表或SP执行DROP/CREATE而不是ALTER时,我得到了相同的结果。此外,是否有可能在游标中抛出错误,并且在记录错误时出现truncate警告?存储过程中是否有对varchar变量的操作,或者直接插入?请在varchar变量周围使用LTRIM(RTRIM())确保没有空格。是否涉及链接服务器以及读取数据的权限问题?