2016-04-14 89 views
2

當我運行的更新/插入語句特定表我返回以下錯誤:MS SQL - 截斷誤差

* ERROR 8152 *(RC-1):SQLSTATE = 22001 Microsoft SQL Server本客戶端10.0 字符串或二進制數據將被截斷。

我已經通過手動我嘗試更新,看看是否有比允許的列最大VARCHAR更大的值,並且每個使用下面的腳本無法找到任何表了:

select max(len(COLUMN_NAME)) from TABLE_NAME 

有沒有辦法查詢數據庫的所有列中的值是否超出了列的最大允許字符數?

+0

顯示更新/插入查詢。這實際上是必不可少的部分 –

+5

您正在尋找錯誤的地方 - 您正在尋找太大的_existing_數據。你需要看看什麼數據被添加到表中。查看'UPDATE' /'INSERT'語句和那裏的值。 –

+1

太大而無法放入列的數據將不在列中,因爲它對於列來說太大您的UPDATE或INSERT語句將數據加載到表中,而且它所加載的數據包含數據那太大了。 [這也是從MS Sql服務器](https://connect.microsoft。com/SQLServer/feedback/details/339410 /),它只是告訴你一些太大的東西,甚至不會告訴你哪一列太大了。自2008年以來,他們一直想要解決它。 – JNevill

回答

0
  1. 發生此錯誤是因爲在插入/更新語句中存在超出目標列允許的最大字符數的值。然而,插入/更新將成功,問題是該值將被截斷爲允許的最大字符數。所以如果你定義了一個VARCHAR(100)並且你插入/更新了101個字符,那麼最後一個字符會被留下。
  2. 如果由於SQL Server不存儲和隱藏超出的字符或某些東西而導致值超出了列中允許的最大字符數,則無法通過查詢或其他方式查看它只存儲了多少個字符你告訴它存儲。
  3. 如果列中的值處於未知範圍內,則可以使用VARCHAR(MAX)。
+0

謝謝,先生。最終結果是觸發器被設置爲將值插入到審計表中的列中。該列不存在。 –

1

有沒有一種方法來查詢值DB的溢出允許的最大字符數爲它的列的所有列?

正如其他評論指出,問題不在於目標表中的數據,而是您嘗試插入/更新的數據。

但是,如果您插入/更新從不同表中選擇的數據,這些查詢可能對您有用。大多數情況下,他們寫作很有趣。

更換#MAX_LENGTH#佔位符和兩個#TABLE_NAME#佔位符,這會給你的表任何違規的值。

declare @dyn varchar(max) 
select @dyn = 'select null as [Column], null as [Value], null as [Lenght] ' 
select @dyn = @dyn 
+ 'union select ''' + name + ''', cast(' + name + ' as varchar(max)), len(' + name + ') 
    from #TABLE_NAME# 
    where len(' + name + ') > #MAX_LENGTH#' 
from sys.columns c 
where c.object_id = object_id('#TABLE_NAME#') 
exec(@dyn) 

更換兩個#TABLE_NAME#佔位符,這將顯示在您的表格的每一列中的值的最大長度。

declare @dyn varchar(max) 
set @dyn = 'select 0 x' 
select @dyn = @dyn + ', max(len(' + name + ')) as [' + name + ']' 
from sys.columns c 
where c.object_id = object_id('#TABLE_NAME#') 
exec(@dyn + 'from #TABLE_NAME#')