“문자열 또는 이진 데이터가 잘립니다.”를 담당하는 열을 어떻게 식별합니까?


31

원격 Pg 데이터베이스에서 SELECT에 작성한 코드를 사용하여 자동으로 일부 쿼리를 생성하고 로컬 SQL Server 데이터베이스에 삽입합니다. 그러나 그중 하나 가이 오류를 생성합니다.

[Microsoft] [ODBC SQL Server 드라이버] [SQL Server] 문자열 또는 이진 데이터가 잘립니다. (SQL-22001) [현재 상태는 22001이었으며 현재는 01000입니다.]

[Microsoft] [ODBC SQL Server 드라이버] [SQL Server]이 문이 종료되었습니다. . \ insert.pl 줄 106의 (SQL-01000).

어떤 오류가 해당 열을 생성하고 입력 길이가 부족한지 어떻게 알 수 있습니까? 모든 것을 무차별 적으로 추측하지 않고 이것을 할 수있는 방법이 varchar있습니까?

답변:


35

아니요, 어디에도 기록되지 않습니다. 투표하고 비즈니스 사례를 진술하십시오. 이것은 SQL Server에서 수정해야 할 긴 목록 중 하나입니다.

이것은 몇 년 전에 Connect (아마도 SQL Server 2000 또는 2005 시간대)에서 요청 된 다음 새로운 피드백 시스템에서 다시 요청되었습니다.

이제는 SQL Server 2019 에서 SQL Server 2017 CU12로 제공되었으며 향후 SQL Server 2016 SP2 CU에 나타날 것입니다.

SQL Server 2019의 최초 공개 CTP에서는 추적 플래그 460 만 표시됩니다. 이것은 비밀스러운 소리이지만 이 백서 에 게시되었습니다 . 앞으로는 기본 동작 (추적 플래그 필요 없음)이지만 새로운 데이터베이스 범위 구성을 통해이를 제어 할 수 있습니다 VERBOSE_TRUNCATION_WARNINGS.

예를 들면 다음과 같습니다.

USE tempdb;
GO
CREATE TABLE dbo.x(a char(1));

INSERT dbo.x(a) VALUES('foo');
GO

SQL Server 2019 이전의 모든 지원 버전 결과 :

메시지 8152, 수준 16, 상태 30, 줄 5
문자열 또는 이진 데이터가 잘립니다.
그 진술서는 만료되었습니다.

이제 SQL Server 2019 CTP에서 추적 플래그가 활성화되었습니다.

DBCC TRACEON(460);
GO

INSERT dbo.x(a) VALUES('foo');
GO
DROP TABLE dbo.x;
DBCC TRACEOFF(460);

도시를 테이블, 열 및 (결과 절단 이 아니라 전체 ) 값 :

메시지 2628, 수준 16, 상태 1, 줄 11
문자열 또는 이진 데이터는 테이블 'tempdb.dbo.x', 열 'a'에서 잘립니다. 잘린 값 : 'f'.
그 진술서는 만료되었습니다.

당신이 모든을 삭제하고 SQL 서버 2019, 또는 푸른 SQL 데이터베이스로 이동하려면 업그레이드 할 때까지 실제로에서 MAX_LENGTH을 당겨에, 당신은 당신의 "자동으로 자료"코드를 변경할 수 있습니다 sys.columns어쨌든이 점점하고 적용해야하는 이름과 함께, LEFT(column, max_length)또는 PG의 동등한 것은 무엇이든. 또는 이는 자동으로 데이터를 잃게된다는 것을 의미하므로 불일치하는 열을 찾아 소스의 모든 데이터에 맞도록 대상 열을 수정하십시오. 두 시스템 모두에 대한 메타 데이터 액세스와 소스-> 대상 열을 자동으로 일치시켜야하는 쿼리를 작성하고 있다는 사실을 감안할 때 (그렇지 않으면이 오류는 가장 큰 문제는 아닐 것입니다.) 무차별 강제 수행 할 필요가 없습니다. 전혀 추측.


2

SQL Server Management Studio에서 SQL Server 가져 오기 및 내보내기 마법사 를 실행할 수있는 권한이있는 경우 (데이터베이스를 마우스 오른쪽 단추로 클릭> 작업> 데이터 가져 오기 ...) 쿼리를 데이터 소스로 사용하여 SQL 클라이언트에서 가져 오는 작업을 대상으로 만듭니다. 표.

가져 오기를 실행하기 전에 데이터 맵핑을 검토 할 수 있으며 필드 유형이 일치하지 않는 열을 알려줍니다. 가져 오기 작업을 실행하면 가져 오기에 실패한 열이 표시됩니다.

샘플 유효성 검사 경고 :

경고 0x802092a7 : 데이터 흐름 작업 1 : 길이가 316 인 데이터 흐름 열 "NARRATIVE"에서 길이가 60 인 데이터베이스 열 "NARRATIVE"에 데이터를 삽입하면 잘림이 발생할 수 있습니다 (SQL Server 가져 오기 및 내보내기 마법사)


1

궁극적으로 열 정보를 직접 쓰지 않고 열 정보를 얻는 방법을 찾을 수 없었습니다.

이 오류 메시지는에 의해 생성 DBD::ODBC되었지만 사용할 수도 있습니다 sys.columns (max_length)(어떻게할지 모르겠습니다).

열 목록에서 이와 같은 코드를 사용하여 COLUMN_NAME, 및 MAX_LENGTH( DBI에column_info() 문서화 된 ) 두 요소가있는 배열 목록을 가져 왔습니다 .

my @max_lengths = map [ @{$_->fetchall_arrayref->[0]}[3,6] ]
    , map $dbh_mssql->column_info('database', 'dbo', $dest_table, $_)
    , @col_mssql
;

그런 다음 예외를 포착하고 INSERT유용한 것을 인쇄했습니다. 이 예에서 @$row전송 된 데이터이다sth->execute()

if ($@) {
        warn "$@\n";
        for ( my $idx=0; $idx <= $#{ $row }; $idx++ ) {
                Dumper {
                        maxlength => $max_lengths[$idx]->[1]
                        , name    => $max_lengths[$idx]->[0]
                        , length  => length( $row->[$idx] )
                        , content => $row->[$idx]
                };
        }
        die;
}

또한, 다른 답변에 투표하고 찬성하십시오


2
sys.columns쿼리를 "자동으로"생성하기 위해 현재 사용중인 코드를 전혀 몰랐기 때문에 코드 참조를 작성하지 않았습니다 . 실제로 코드에 통합하는 것보다 훨씬 복잡하지는 않습니다 SELECT name, object_id, max_length FROM sys.columns;. 이 작업을 수행 해야하는 자동 코드가 이미 있기 때문에 예제가 필요하다고 생각하지 않았습니다.
Aaron Bertrand

sys.columns같은 두 개의 열이 어떻게 작동 하는지 잘 모르겠습니다 name. 또한 라이브러리 대신 라이브러리를 사용하여 작업하는 것을 얻었습니다 sys. 왜 선택한 답변으로 만들까요? Microsoft SQL doesn't have x, do y instead유효한 기여이지만, 당신 y이 나의보다 열등한 경우 y, 나는 다른 것을하고 선택된 것으로 표시 할 것입니다.
Evan Carroll

1
귀하의 질문은 본질적으로 어떤 열이 오류를 생성했는지 어떻게 알 수 있습니까? (아마도 솔루션을 다시 엔지니어링하는 대신 한 지점을 수정할 수 있습니다). sys.columns를 볼 위치를 알려주었습니다. 소스 열 길이와 대상 열 길이를 정확히 비교해야 할 곳입니다. 그렇게하는 방법은 당신에게 달려 있습니다. 코드를 수정하는 방법을 알려주지 않았습니다. 왜냐하면 자동 쿼리가 처음에 어떻게 생성되는지 전혀 알 수 없으므로 이미 말한 것처럼 길이 결정을 추가하는 방법을 전혀 몰랐기 때문입니다. .
Aaron Bertrand

1

마지막으로 마이크로 소프트는 의미있는 정보를 제공하기로 결정했다 위해 String or binary would be truncatedSQL 서버 2016 SP2 CU, SQL 서버 2017 CU12에서 및 SQL Server 2019에서 시작.

이 정보에는 이제 위반 테이블 열 (정규화 된 이름)과 위반 값 (120 자에서 잘림)이 모두 포함됩니다.

메시지 2628, 수준 16, 상태 1, 줄 x 문자열 또는 이진 데이터는 테이블 'TheDb.TheSchema.TheTable', 열 'TheColumn'에서 잘립니다. 잘린 값 : '...'. 그 진술서는 만료되었습니다.

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