2011-11-15 2 views
0

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

답변

1

당신이에서 업데이트하는 어떤 소스? 나는. 집합 기반 연산으로 다른 테이블에서 업데이트 하시겠습니까? 아니면 한 번에 하나씩 행을 업데이트하는 응용 프로그램의 루프에서 업데이트 하시겠습니까?

이 문제는 특정 열 또는 다양한 열에 대해 문제가 있습니까?

더 많은 문제를 해결하면 문제를 쉽게 해결할 수 있습니다. 그 대답을하고 내 대답을 더 많은 정보로 업데이트 할 것입니다. 기본적으로 문제를 일으키지 않는 레코드 만 소스 데이터를 통해 쿼리하고 처리하려고합니다. 나머지는 예외로보고하고 잘라내어 원하는 경우 가져올 수 있습니다.

편집 :이 문제를 해결하기 위해 어떤 환경을 사용하고 있는지 알 수는 없지만 기본적으로 가져올 데이터의 길이를 가져올 필드의 길이와 비교해야합니다. 순수한 SQL에서이 작업을 수행하는 경우이를 수행하는 것이 가능하지만 엉덩이에 큰 고통이 될 것입니다. .net 또는 유사한 언어를 사용한다면 그다지 문제가되지 않습니다.

점검은 업데이트 전에 수행되는 것이지 업데이트의 일부로 수행되지는 않습니다. 따라서 쿼리 계획을 다시 사용하는 것은 문제가되지 않습니다. 속도가 문제라면 커밋 할 특정 수의 업데이트를받은 후에 만 ​​업데이트를 수행하는 전략을 생각해 볼 수 있습니다. 그렇게하면 한 번에 한 번에 한 번에 100 건의 업데이트를 기반으로하는 작업을 설정할 수 있습니다. 그것은 실시간 업데이트가 필요 없다고 가정합니다.

+0

임의의 문자열에서 업데이트 중입니다. 데이터는 다운 스트림 시스템으로가는 보고서 출력이며, 일부 데이터는 끝에 '(편집 된)'텍스트를 추가하는 것과 같이 추가해야합니다. 그것은 여러 열에 있으며 나는 이미 동적 SQL을 사용하여 첫 번째 장소에서 업데이트 문을 작성해야합니다. – Snowy

+0

각 문자열에는 여러 레코드 업데이트에 대한 데이터 또는 문자열 당 하나의 레코드 업데이트가 포함되어 있습니까? 그리고 하나 더 질문 : 속도 문제가 무엇입니까? 나는 예외를 잡기가 아주 쉬운 C# 같은 언어에서 이것을하지 않는다고 가정 할 것입니다. –

+0

문자열 당 하나의 업데이트. 속도는 문제지만 일을 끝내는 것도 중요합니다. – Snowy

1

"또 다른 옵션은 행을 잡을 방법을 파악하는 것 (첫번째 행?)에 실패하고 호출자에게보고하게한다. 에러 레벨이 너무 때문에 내가 이 작동합니다 생각하지 않습니다 높은 문제를 정확하게 알려주도록 높이. "

문제점 (즉, 어떤 열이 발생하는지)을 정확히 알아 내야한다고 가정했습니다.그렇지 않은 경우 다음을 수행하면됩니다.

ansi 경고를 사용하여 업데이트하려고 시도 할 수 있으며 오류가 발생한 경우 예외를보고하고 ansi 경고를 해제 한 다음 테이블로 가져온 다음 다시 ansi 경고를 켜십시오.

그러나 문제를 정확히 찾아야하는 경우 문제를 찾기 위해 더 많은 코드가 필요합니다 ... 그러나 속도를 높이기 위해 앞에서 설명한 방법을 사용할 수 있도록 사전에 오류를 찾고 싶지는 않습니다. 문제가 발생하면 SQL은 하나를 알려줍니다.

관련 문제