SQL Server Insert Into - 如何辨識導致截斷錯誤的列
我有一個將 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...
然後比較表元數據。另一種可能性是對有問題的列進行二進制搜尋,但這也是手動工作。元數據比較有一些技巧,但不存在簡單、優雅的解決方案。也許一些第三方工具會有所幫助,但我不知道。