2011-02-28 73 views
5

我試圖將一些數據插入表被截斷,我得到了錯誤消息這將在插入查詢

Msg 8152, Level 16, State 14, Line 1 
String or binary data would be truncated. 

現在我知道,這是由於試圖插入這是數據識別值對於列太大(在這種情況下是VARCHAR(50)),但它讓我想到是否有可能:

a)看看什麼具體的值會被截斷(記住這可能會發生多列),也許通過給出所有將被截斷的行的輸出?

b)如果在批處理插入內,有任何方法可以查看每列將被截斷的最大輸入數據值(所以我可以看到數據存儲類型實際上是否需要更改或者只有一個或兩個案例不適合列?)

回答

11

找到有問題的行沒有特別令人滿意的方式。

This blog post has one solution.SET ANSI_WARNINGS OFF並插入到一個臨時表中,然後使用EXCEPT對源地發現,沒有成功導入行)如果您的使用相當簡單類型

+0

我看到這個,但我發現的問題是,它並沒有明確哪一列已被截斷(因爲我有很多潛力)的每一行,因爲除了子句 – Dibstar 2011-02-28 15:13:27

+0

除了@Dibstar的公平點之外,這是一個縮小範圍的好方法。值得一提的是,作爲一個經驗法則,如果只有一半的人做正確的工作會導致用戶看到誤導或奇怪的事情,那麼他們什麼也看不到。最好不要在常規生產中使用它,除非例外情況明確標記給用戶,或者您確信唯一現實的失敗案例會創建99%的用戶沒有probs,1%的用戶沒有關鍵的probs。 事實上,如果出現> n或n%的錯誤,你也可以設置一個'TRY CATCH'來回滾整個事物。 – Adamantish 2014-07-25 18:38:37

+0

@Adamantish我想你可以使用[這種方法](http://stackoverflow.com/q/3248670/73226)找到列。我看到你已經在那裏評論過了! – 2014-07-30 22:12:10

0

你可以嘗試

select datalength(mycolumn) from mytable where myid = 1 
+0

如果你沒有添加where子句來限制行,你會得到每行1個結果......(這是使用sql-server ...我不確定這將適用於每個數據庫。) – 2011-02-28 14:56:15

2

你可以獲得表格中列的最大長度如下

SELECT CHARACTER_MAXIMUM_LENGTH 
FROM MyDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='MyTableName' 

INFORMATION_SCHEMA.COLUMNS是一個內置的系統視圖。這應該有助於你的第二個問題。

+0

我不知道這個,應該進來非常方便:) – Dibstar 2011-02-28 15:09:06

+0

@達文很樂意幫助 - 你可以upvote答案,如果你喜歡它,並認爲它是有用的:) – 2011-02-28 15:36:39

1

我發現的最佳解決方案是通過僅將結構選入新表(SELECT INTO FROM WHERE 1 = 0)並比較列類型和長度。 Full answer here.