我们有一些代码在过去一天内开始抛出错误。代码几个月没有变化。错误消息是:
Msg 8152,Level 16,State 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?此外,代码以原始形式在我们的开发服务器上工作。我们实际上备份了数据库,恢复到dev,运行代码并且它可以工作。
答案 0 :(得分:1)
我的猜测是您使用LEN(列)检查数据?这将告诉你字符数,不包括任何空格。我有一种感觉,白色空间是它错误的原因。尝试修剪空白区域。
UPDATE TUP
SET insured_state_cd = RTRIM(LTRIM(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_c
答案 1 :(得分:0)
你没有说任何引发任何危险信号或有(对我而言)明显的答案。以下是我要研究的一些事情(您可能已经做过)。
你说“CHAR”类型。 CHAR,还是VARCHAR?让我们想知道领先和/或尾随空格。 (那里有任何nvarchars?varchar(max)怎么样?)这有助于查看#TEMP_UAFR_POLICY和UVW_THIRDS_CONTACTS_ADDRESSES的表定义。
您已使用LEN()和 DATALENGTH()函数检查列,是吗?
“备份生产并恢复开发”与#tempdbs相结合,让我想起了我们在所有其他SQL安装中安装带有代码页(或其他)不同的SQL的时间。数据库都运行相同,但系统数据库 - 最值得注意的是tempdb-在不同的假设下运行,这导致了一些相当微妙的问题。也许某事正在那里发生?
检查并比较两种环境之间SQL的版本和版本,直至Service Pack。