我们有一些在过去一天开始抛出错误的代码。该代码几个月没有改变。该错误消息是:无理由的SQL截断错误
消息8152,级别16,状态2
字符串或二进制数据将被截断。
的SQL语句是:
UPDATE TUP
SET insured_state_cd = UTCA.state_province_cd
FROM #TEMP_UAFR_POLICY TUP
JOIN dbo.UVW_THIRDS UT ON
TUP.prim_owner_third_id = UT.third_id
JOIN dbo.UVW_THIRDS_CONTACTS_ADDRESSES UTCA ON
UT.primary_address_id = UTCA.address_id
JOIN dbo.UVW_INTERNATIONAL_COUNTRY UIC ON
UTCA.country_cd = UIC.country_cd
现在,我会告诉你,是的,UTCA.state_province_cd列比insured_state_cd列大。我们知道这不是一件好事,但我们的测试过程至少需要一个月的时间才能将变更批准并投入生产。我们真的需要弄清楚这个问题的原因。
我们检查了UTCA表,没有记录的长度超过2,这是TUP表中列的大小。由于它是CHAR类型,我们还检查了表的二进制值以确保它不是回车或其他隐藏字符。
为了增加神秘感,此代码的工作:
UPDATE TUP
SET insured_state_cd = UTCA.state_province_cd
FROM #TEMP_UAFR_POLICY TUP
JOIN dbo.UVW_THIRDS UT ON
TUP.prim_owner_third_id = UT.third_id
JOIN dbo.UVW_THIRDS_CONTACTS_ADDRESSES UTCA ON
UT.primary_address_id = UTCA.address_id
JOIN dbo.UVW_INTERNATIONAL_COUNTRY UIC ON
UTCA.country_cd = UIC.country_cd
WHERE UTCA.state_province_cd IN
(SELECT DISTINCT UTCA2.state_province_cd
FROM dbo.UVW_THIRDS_CONTACTS_ADDRESSES UTCA2)
正如你所看到的,第二个代码是一样的,第一,它基本上只是检查做1 = 1?此外,代码以原始形式在我们的开发服务器上运行。我们直接备份数据库,恢复到开发,运行代码,它的工作原理。
如果你只想要UTCA.state_province_cd的前两个字符,那'SET insured_state_cd = LEFT(UTCA.state_province_cd,2)...'''开发人员和生产数据库是否运行*完全相同版本的SQL Server? – 2015-04-02 18:28:17
下面是一个*疯狂的想法 - 为什么不创建#temp表,以便其列和数据类型实际上匹配源表?我无法理解为什么增加#temp表定义的长度需要任何时间来批准和部署。如果这需要一个月,那么你有更大的问题,字符串截断。 – 2015-04-02 18:57:10
另外,你是否检查了连接产生的值,或者表中的所有***值? SQL Server可以按照不同的顺序优化事物,其中在一个服务器上的过滤器之前检查长度,并且在另一个过滤器之后检查长度。 – 2015-04-02 18:59:35