當更新一系列包含多個VarChar(n)列的表時,執行Replace操作的某些更新會使我的事務處理中「字符串或二進制數據將被截斷」。我試圖想出一個可重複的方法來處理這個問題。SQL Server字符串二進制數據將被截斷捕獲
一個選項是首先選擇行ID和要變換的列的長度,如果其長度超過列的大小。我不是這樣的粉絲,因爲它看起來像我不會得到任何查詢計劃重用,它會執行得很慢。
另一個選擇是弄清楚如何捕捉導致失敗的行(第一行?)並將其報告給調用者。我不認爲這會起作用,因爲錯誤級別太高,無法讓我指出問題所在。
我也可以通過獲取新值的子字符串/左側並放入它來忽略整個事情,但這會掩蓋它並且不讓我知道實際問題的位置。
我使用的是MSSQL 2008
編輯 - 這裏的想法看起來有點前途: http://sqlblogcasts.com/blogs/danny/archive/2008/01/12/scuffling-with-string-or-binary-data-would-be-truncated.aspx:
1. Take a copy of the destination table:
SELECT * INTO #Destination FROM DestinationTable WHERE 1=2
GO
2. Set ANSI_WARNINGS OFF and perform the insert into the copy of the destination table, then set ANSI_WARNINGS ON again:
SET ANSI_WARNINGS OFF
GO
INSERT INTO #Destination
SELECT * FROM SourceTable
GO
SET ANSI_WARNINGS ON
GO
As ANSI_WARNINGS is off SQL Server truncates the fields rather than produces the warning.
3. Next compare what you would like to insert against what was inserted with the ANSI_WARNINGS OFF truncating. By using EXCEPT you only select the rows that don't match, and have therefore been truncated:
SELECT * FROM SourceTable
EXCEPT
SELECT * FROM #Destination
GO
我正在從任意字符串更新。數據是要傳送到下游系統的報告輸出,有些數據需要追加,如追加文本末尾的「(已編輯)」。它有多個列,我已經堅持做動態SQL來首先創建更新語句。 – Snowy
那麼每個字符串都包含多個記錄更新的數據,或者每個字符串只有一個記錄更新?還有一個問題:速度是一個問題?我假設你不是用像c#這樣的語言來做這件事,因爲這些例外很容易被捕獲。 –
每個字符串更新一次。速度是一個問題,但完成工作也很重要。 – Snowy