当更新一系列包含多个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