我們有一些在過去一天開始拋出錯誤的代碼。該代碼幾個月沒有改變。該錯誤消息是:無理由的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