SQL Server Insert Into-잘림 오류를 발생시키는 열을 식별하는 방법


11

650 필드를 테이블에 삽입하는 저장 프로 시저가 있습니다. 잘림 오류로 인해 삽입에 실패했습니다.

간단합니다

INSERT INTO
SELECT (a bunch of fields) 
FROM (a bunch of tables)

다음은 오류 메시지입니다.

메시지 8152, 수준 16, 상태 14, 프로 시저 DSP_Procedure, Line 1075 문자열 또는 이진 데이터가 잘립니다.

잘림 오류를 일으키는 필드를 식별 할 수있는 빠른 방법이 있습니까?

테이블에 삽입 될 select 문에 650 개의 필드가 있으므로 잘라 내기 오류를 일으키는 필드를 정확히 찾아 내기가 어렵습니다.

SP가 한 번에 100 개의 필드 만 삽입하고 적어도 100 개의 필드 그룹으로 좁힐 수있을 때까지 SP 6 또는 7을 다른 시간 동안 실행하도록 한 번에 필드 블록을 주석 처리 할 수 ​​있다고 생각합니다. 여기에는 잘림 오류를 발생시키는 필드가 포함됩니다.

또는 SELECT INTO새 테이블을 만든 다음 테이블의 데이터 길이와 대상 테이블의 데이터 길이를 비교하여 SP에 삽입하려고하는 필드가 예상보다 긴 필드 길이를 포함하는지 확인합니다. ..

SQL Server 2014를 사용하고 있습니다.

더 쉬운 대안이 있습니까?


1
INFORMATION_SCHEMA.COLUMNS로 이동하여 삽입하려는 유형과 데이터 유형을 비교합니다. 불행히도 SQL Server에는 ORACLE처럼 변수 선언에 대한 동적 데이터 유형이 없습니다.
MguerraTorres

2
두 번째 옵션을 사용하고 새 (또는 #temp) 테이블에 삽입 한 다음 열 길이를 비교하십시오. 또는 select의 모든 열 주위에 LEN ()을 래핑 한 다음 외부 쿼리에서 각각에 대해 MAX ()를 수행하여 필드의 최대 텍스트 길이를 제공 할 수 있습니다. 물론, 그것이 문제를 일으키는 char 필드라고 가정합니다. smalldatetime 또는 tinyint를 사용하지 않습니까?
Jonathan Fite

1
"Select Into"접근 방식으로 이동하여 열 길이를 비교합니다. "WHERE 1 = 0"일 수 있으므로 테이블에 행이 없습니다. SELECT에 선택한 열의 고유 이름이 포함되어 있지 않으면 어색합니다. 긴 열 목록을 열당 한 줄의 스크립트로 포맷 한 다음 필요한 경우 다음 줄에 "AS"열 이름을 지정하고 4 개의 열 뒤에 빈 줄을 추가하여 목록에 쉽게 배치 할 수 있도록합니다. 또한 많은 행을 선택하고 Ctrl + K Ctrl + C를 사용하여 주석으로 변경하여 삽입 조작을 공격 할 수는 있지만 남은 열은 널 입력 가능해야합니다.
Robert Carnegie

답변:


3

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해당 유형의 잘림을 무시하는 데 사용할 수 있습니다 .


9

불행히도, 당신은 꽤 오래된 "기능"을 만났습니다 . 2008 년부터 커넥트 티켓이 개설되었으며 거의 ​​10 년 동안이 문제를 해결하기에 충분하지 않았습니다.

표준 해결 방법은 당신이 생각처럼이있다 select into...테이블 메타 데이터를 비교 하였다. 또 다른 가능성은 문제가되는 열을 이진 검색하지만 수동 작업이기도합니다. 메타 데이터 비교에는 몇 가지 해킹이 있지만 간단하고 우아한 솔루션은 존재하지 않습니다. 어쩌면 일부 타사 도구가 도움이 될 수도 있지만 그러한 사실을 알지 못합니다.


1

(QUERYTRACEON 460)을 사용하면 쿼리 끝에 넣을 때 작동하지 않았습니다.

DB 수준에서 켜고 작동했습니다.

DBCC TRACEON(460, -1);
GO

그러나 문제를 발견하고 해결 한 후에는 다시 끄십시오. 그대로 두지 마십시오.

DBCC TRACEOFF(460, -1);
GO
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.