Sql-Server

SQL Server Insert Into - 如何辨識導致截斷錯誤的列

  • February 7, 2020

我有一個將 650 個欄位插入到表中的儲存過程。插入因截斷錯誤而失敗。

這是一個簡單的

INSERT INTO
SELECT (a bunch of fields) 
FROM (a bunch of tables)

以下是錯誤消息:

消息 8152,級別 16,狀態 14,過程 DSP_Procedure,第 1075 行字元串或二進制數據將被截斷。

有沒有一種快速的方法可以辨識導致截斷錯誤的欄位?

要插入到表中的 select 語句有 650 個欄位,這一事實使得很難確定哪個欄位導致了截斷錯誤。

我想我可以一次註釋掉欄位塊,以便讓 SP 一次插入 100 個欄位,然後執行 SP 6 或 7 個不同的時間,直到我至少可以縮小到一組 100 個欄位這將包含導致截斷錯誤的欄位。

或者,我在想,也許我可以只是SELECT INTO一個新表,然後比較表中的數據長度與我試圖在我的 SP 中插入的目標表的數據長度,以查看哪個欄位包含比預期更長的欄位長度。 ..

我正在使用 SQL Server 2014。

有更簡單的選擇嗎?

如果您使用的是 SQL Server 2016(SP2、CU6 或更高版本),則一種選擇是打開跟踪標誌 460,例如(QUERYTRACEON 460). 輸出將指示列和違規數據。

有關詳細資訊,請參閱本文。 https://www.brentozar.com/archive/2019/03/how-to-fix-the-error-string-or-binary-data-would-be-truncated/

如果您不關心截斷,您可以使用SET ANSI_WARNINGS OFF忽略該類型的截斷。

不幸的是,您遇到了相當古老的“功能”。自 2008 年以來一直存在 Connect 票證,近十年來,這還不足以保證修復。

標準的解決方法是,就像您想的那樣,select into...然後比較表元數據。另一種可能性是對有問題的列進行二進制搜尋,但這也是手動工作。元數據比較有一些技巧,但不存在簡單、優雅的解決方案。也許一些第三方工具會有所幫助,但我不知道。

引用自:https://dba.stackexchange.com/questions/179468