2014-10-10 29 views
-1

我們用列B中的確切值更新列A.列B的長度爲255,列A的長度爲4.列B中的數據已通過LEN(REVERSE(colB) )是唯一4.當我們試圖更新錯誤消息說:數據應該適合的截斷警告

'String or binary data would be truncated.' 

這裏是查詢:

update table 
set columnA=columnB 
where Column B in ('ABC','ABCD','AB') 

我們也驗證了這個工程:

update table 
set columnA=left(columnB,4) 
where Column B in ('ABC','ABCD','AB') 

有什麼猜測可能是錯的? 感謝

+0

這很明顯..用'columnA = columnB'你試圖將columnb值完全設置爲columna,這就是錯誤的原因。您的第二個查詢通過僅剪切4個字符來執行正確的操作。順便說一句,你的'WHERE'條件永遠不會是真的,因爲'columnB'將不符合那些提供的值。 – Rahul 2014-10-10 16:31:43

+0

您是否嘗試將列B投影爲varchar(4)? – 2014-10-10 16:32:07

+0

第二個查詢(LEFT(4))是否也提供錯誤消息? – Ruslan 2014-10-10 16:33:13

回答

-1

此查詢的工作原理我對此表示滿意。

更新表 組columnA = columnB
其中在( 'ABC', 'ABCD', 'AB')和LEN(columnb)列B < = 4

我仍然好奇,爲什麼

+0

原因:因爲引擎會查看錶格中爲這兩個字段定義的字段大小,而不是數據本身。通過指定長度限制,它將覆蓋兩個表中兩個字段的分析。如果你指定<= 5,你可能仍然會得到錯誤,因爲columnA只有4個字符... – xQbert 2014-10-10 18:36:12

+0

,它可能是一個警告..。不是一個錯誤。指示數據可能已被截斷...... – xQbert 2014-10-10 18:37:08

+0

@xQbert根本不可能,因爲SQL Server在該實例中不會返回任何警告。嘗試一下。 – 2014-10-10 19:44:51

0

這可能是因爲您使用的B列char(不varchar)數據類型,在這種情況下,你的數據庫引擎可以考慮在列的寬度,而不管數據的寬度。一個trim函數可能會擺脫這個錯誤。

+0

字段都是Varchar – user1775461 2014-10-10 16:40:38

-1

SQL不檢查字符串的實際長度 - 它只是檢測到字符串值可能會溢出新容器並給出錯誤消息。試試這個:

update table set ColumnA =(從列表中選擇LEFT(ColumnB,4),其中ColumnB在('ABC','ABCD','AB'));

這將只選擇來自columnB的數據的前四個字符。

+0

SQL Server不會給出在此上下文中字符串可能溢出的警告。您只能在某些DDL中看到此類警告(例如,創建索引的位置可能大於900個字節)。這是一條實際的錯誤消息。 – 2014-10-10 16:43:53

+0

@馬丁史密斯:我問。 FWIW,OP在評論中說,這是一個警告,而不是一個錯誤。 – 2014-10-10 16:53:59

+0

@mike是的我看到了,但他們錯了。更新將失敗。此消息的嚴重性是錯誤而不是警告。 – 2014-10-10 16:57:03