Nice programing

SQLException : 문자열 또는 이진 데이터가 잘립니다.

nicepro 2020. 12. 29. 08:27
반응형

SQLException : 문자열 또는 이진 데이터가 잘립니다.


일괄 적으로 많은 삽입 문을 수행하는 C # 코드가 있습니다. 이 문을 실행하는 동안 "문자열 또는 이진 데이터가 잘립니다"오류와 트랜잭션 롤백이 발생했습니다.

어떤 삽입 문이이 문제를 일으켰는지 확인하려면 오류가 발생할 때까지 SQLServer에 하나씩 삽입해야합니다.

예외 처리를 사용하여 어떤 문과 어떤 필드가이 문제를 일으켰는지 알아내는 영리한 방법이 있습니까? (SqlException)


일반적으로 오류를 일으킨 특정 문을 확인할 수있는 방법은 없습니다. 여러 개를 실행하는 경우 프로파일 러를보고 마지막으로 완료된 명령문을보고 그 이후의 명령문이 무엇인지 확인할 수 있지만 그 접근 방식이 당신에게 적합한지는 모르겠습니다.

어떤 경우에도 매개 변수 변수 중 하나 (및 그 안의 데이터)가 데이터를 저장하려는 필드에 비해 너무 큽니다. 열 크기와 비교하여 매개 변수 크기를 확인하면 해당 필드가 매우 빠르게 분명해질 것입니다.


이 유형의 오류는 SQL Server 열의 데이터 유형 길이가 입력 양식에 입력 된 데이터 길이보다 작을 때 발생합니다.


이 유형의 오류는 일반적으로 데이터베이스 테이블에 지정한 것보다 더 많은 문자 또는 값을 입력해야 할 때 발생합니다. transaction_status varchar (10)을 지정했지만 실제로 19 개의 문자를 포함하는 _transaction_status를 저장하려고합니다. 그래서이 코드에서 이런 유형의 오류가 발생했습니다.


BEGIN TRY
    INSERT INTO YourTable (col1, col2) VALUES (@val1, @val2)
END TRY
BEGIN CATCH
    --print or insert into error log or return param or etc...
    PRINT '@val1='+ISNULL(CONVERT(varchar,@val1),'')
    PRINT '@val2='+ISNULL(CONVERT(varchar,@val2),'')
END CATCH

일반적으로 허용되는 최대 값보다 큰 값을 삽입하는 것입니다. 예, 데이터 열은 최대 200 자까지만 포함 할 수 있지만 201 자 문자열을 삽입합니다.


삽입 호출을 만드는 방법에 따라 다릅니다. 모두 하나의 호출로, 아니면 트랜잭션 내에서 개별 호출로? 개별 호출이면 예 (호출을 반복 할 때 실패한 호출을 포착). 한 번 큰 전화를 걸면 아니오. SQL은 전체 문을 처리하고 있으므로 코드의 손에서 벗어납니다.


  1. 문제를 일으키는 쿼리를 가져옵니다 (소스가없는 경우 SQL 프로필러를 사용할 수도 있음).
  2. 기본적으로 SELECT 및 FROM 부분 만 남길 때까지 모든 WHERE 절과 기타 중요하지 않은 부분을 제거합니다.
  3. WHERE 0 = 1 추가 (테이블 구조 만 선택 함)
  4. FROM 절 바로 앞에 INTO [MyTempTable] 추가

당신은 다음과 같은 것으로 끝나야합니다.

SELECT
 Col1, Col2, ..., [ColN]
INTO [MyTempTable]
FROM
  [Tables etc.]
WHERE 0 = 1

그러면 DB에 MyTempTable이라는 테이블이 생성되어 대상 테이블 구조와 비교할 수 있습니다. 즉, 두 테이블의 열을 비교하여 서로 다른 부분을 확인할 수 있습니다. 약간의 해결 방법이지만 내가 찾은 가장 빠른 방법입니다.


Linq To SQL을 사용하여 컨텍스트를 로깅하여 디버깅했습니다. Context.Log = Console.Out그런 다음 SQL을 스캔하여 명백한 오류가 있는지 확인했는데 두 가지가있었습니다.

-- @p46: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value1]
-- @p8: Input Char (Size = -1; Prec = 0; Scale = 0) [some long text value2]

값에 대해 테이블 ​​스키마를 스캔하여 마지막으로 찾은 필드는 nvarchar (20) 이었지만 값은 22 자였습니다.

-- @p41: Input NVarChar (Size = 4000; Prec = 0; Scale = 0) [1234567890123456789012]


null데이터베이스에 값을 다시 입력하려고하기 때문일 수도 있습니다 . 따라서 거래 중 하나에 null이있을 수 있습니다.


우리의 경우에는 프런트 엔드에서 게시 된 총 문자보다 작은 SQL 테이블 허용 문자 또는 필드 크기를 늘립니다. 따라서 문제가 해결됩니다.


여기서 대부분의 답변은 데이터베이스에 정의 된 열의 길이가 전달하려는 데이터보다 작지 않은지 확인하는 것입니다.

여러 번 SQL Management Studio로 이동하여 다음 작업을 빠르게 수행했습니다.

sp_help 'mytable'

문제의 열이 nvarchar 라는 것을 알 때까지 몇 분 동안 혼란스러워하십시오. 즉, sp_help가보고하는 길이는 2 바이트 (유니 코드) 데이터 유형이므로 지원되는 실제 길이의 두 배입니다.

즉, sp_help가 nvarchar 길이 40을보고하면 최대 20 자까지 저장할 수 있습니다.

참조 URL : https://stackoverflow.com/questions/779082/sqlexception-string-or-binary-data-would-be-truncated

반응형