SQL Truncation错误无缘无故

时间:2015-04-02 18:18:59

标签: sql-server tsql truncation

我们有一些代码在过去一天内开始抛出错误。代码几个月没有变化。错误消息是:

  

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,运行代码并且它可以工作。

2 个答案:

答案 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。