2012-10-10 3 views
3

UPDATE 명령을 사용하여 테이블에 문자열 필드를 접두어로 사용하려고 시도합니다. 어떤 이유인지 나는문자열 또는 이진 데이터가 잘립니다. - 필드 길이보다 짧은 길이가 있더라도

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

예외적으로, 데이터 길이가 필드에 쉽게 맞을지라도.

SQL Server 2008 R2 Standard Edition 및 SSMS 2008 R2 사용.

템플릿 다음 작품 반면

select LEN('Aaaaaaaa' + LEFT(learner, 52)) myLen from Template order by myLen desc 
>>> max len = 31 

update Template set learner = 'Aaaaaaaa' + LEFT(learner, 52) 
>>> String or binary data would be truncated. 

update Template set learner = 'Aaaaaaaa' + LEFT(learner, 52) 
>>> String or binary data would be truncated. 

update Template set learner = CAST('Aaaaaaaa' + LEFT(learner, 52) AS NVARCHAR(60)) 
>>> String or binary data would be truncated. 

sp_help는 도시 된 바와 같이 학습자가 60 바이트를 사용 NVARCHAR (30)이다 :

학습자는 NVARCHAR (60)

템플릿 인

SELECT CAST('Aaaaaaaa' + LEFT(learner, 52) AS NVARCHAR(60)) FROM Template 
+5

테이블의 모든 트리거? –

+0

아니,하지만 그건 좋은 팁. 감사. – motto

답변

4

답장을 보내 주셔서 감사합니다. 내가 sp_help는sp_columns에 길이 값에 속지 것처럼

보인다. 그것은 NVARCHAR 열이므로 길이는 문자의 수가 아닌 바이트 단위의 길이를 의미합니다. 이것은 NVARCHAR = Unicode (UTF-16) => 문자 당 2 바이트 이상입니다.

을 보면 CREATE 스크립트에서 진실을 밝혀 냈습니다. 또한 sp_columns의 PRECISION 필드는 문자 수도 표시합니다.

5

이 메시지를 무시해보십시오.

SET ANSI_WARNINGS OFF 
update ... 
SET ANSI_WARNINGS ON 
+9

왜 그랬는지 이해하지 못하고 메시지를 무시하면 항상 나쁜 생각입니다. –

+0

맞습니다.하지만 때로는 사소한 경고를 무시하고 계속 이동해야합니다. – alex

+4

나는 동의하지만이 것은 데이터 손실을 나타내므로 "사소한"것이 아닙니다. 다시 한번 : 먼저 이해하고 결정하십시오. –

0

문제점이 또 다른 로그 테이블 (감사 추적 용)을 가지고 있는데, 컬럼 테이블 크기를 변경해야하는 메인 테이블의 트리거로 채워져 있습니다.

관련 문제