많은 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