나는 4000 최대 세트가 있음을 이해합니다. NVARCHAR(MAX)
이해가 잘못되었습니다. nvarchar(max)
최대 (때로는 그 이상) 2GB의 데이터 (10 억 2 바이트 문자)를 저장할 수 있습니다.
에서 NCHAR 및 NVARCHAR 책 온라인 문법이다
nvarchar [ ( n | max ) ]
|
문자 수단이 대안이다. 즉 , n
또는 리터럴 을 지정 합니다max
.
특정을 지정하도록 선택하는 경우 n
1에서 4,000 사이 여야하지만 using을 사용 max
하면이를 대형 개체 데이터 유형으로 정의합니다 (대체 ntext
가 더 이상 사용되지 않음).
실제로 SQL Server 2008에서는 변수의 경우 2GB 제한이 tempdb
( 여기에 표시됨 )의 충분한 공간에 따라 무기한 초과 될 수 있습니다.
질문의 다른 부분에 관해서
연결시 잘림은 데이터 유형에 따라 다릅니다.
varchar(n) + varchar(n)
8,000 자에서 잘립니다.
nvarchar(n) + nvarchar(n)
4,000 자에서 잘립니다.
varchar(n) + nvarchar(n)
4,000 자에서 잘립니다. nvarchar
우선 순위가 높으므로 결과는nvarchar(4,000)
[n]varchar(max)
+ [n]varchar(max)
는 잘리지 않습니다 (2GB 미만).
varchar(max)
+ varchar(n)
는 잘리지 않으며 (2GB 미만) 결과는 varchar(max)
.
varchar(max)
+ nvarchar(n)
는 잘리지 않으며 (2GB 미만) 결과는 nvarchar(max)
.
nvarchar(max)
+ varchar(n)
는 먼저 varchar(n)
입력을 로 변환 nvarchar(n)
한 다음 연결을 수행합니다. 의 길이 경우 varchar(n)
문자열보다 큰 4,000 자 캐스트에있을 것입니다 nvarchar(4000)
및 절단이 발생합니다 .
문자열 리터럴의 데이터 유형
N
접두사 를 사용하고 문자열 길이가 <= 4,000자인 경우 문자열 길이가 nvarchar(n)
어디에있는 것처럼 입력됩니다 n
. 그래서 예를 들어 N'Foo'
취급됩니다 nvarchar(3)
. 문자열이 4,000 자보다 길면 다음과 같이 처리됩니다.nvarchar(max)
N
접두사를 사용하지 않고 문자열 길이가 <= 8,000자인 경우 문자열 길이가 varchar(n)
어디에있는 것처럼 입력됩니다 n
. 더 긴 경우varchar(max)
위의 두 경우 모두 문자열 길이가 0이면 n
1로 설정됩니다.
최신 구문 요소.
1. 이 CONCAT
기능은 여기서 도움이되지 않습니다.
DECLARE @A5000 VARCHAR(5000) = REPLICATE('A',5000);
SELECT DATALENGTH(@A5000 + @A5000),
DATALENGTH(CONCAT(@A5000,@A5000));
위의 두 연결 방법에 대해 8000을 반환합니다.
2. 조심하세요+=
DECLARE @A VARCHAR(MAX) = '';
SET @A+= REPLICATE('A',5000) + REPLICATE('A',5000)
DECLARE @B VARCHAR(MAX) = '';
SET @B = @B + REPLICATE('A',5000) + REPLICATE('A',5000)
SELECT DATALENGTH(@A),
DATALENGTH(@B);`
보고
-------------------- --------------------
8000 10000
@A
잘림 이 발생했습니다.
발생한 문제를 해결하는 방법.
두 개의 비 max
데이터 유형을 함께 연결하거나 varchar(4001 - 8000)
문자열을 nvarchar
유형이 지정된 문자열 (심지어 nvarchar(max)
)에 연결하기 때문에 잘림이 발생합니다 .
두 번째 문제를 방지하려면 모든 문자열 리터럴 (또는 최소한 4001-8000 범위의 길이를 가진 문자열) 앞에 N
.
첫 번째 문제를 방지하려면 다음에서 할당을 변경하십시오.
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = 'Foo' + 'Bar' + ...;
에
DECLARE @SQL NVARCHAR(MAX) = '';
SET @SQL = @SQL + N'Foo' + N'Bar'
그래서 an NVARCHAR(MAX)
이 처음부터 연결에 포함 되도록 (각 연결의 결과로 NVARCHAR(MAX)
전파 될 것입니다)
볼 때 잘림 방지
"그리드 결과"모드를 선택했는지 확인한 다음 사용할 수 있습니다.
select @SQL as [processing-instruction(x)] FOR XML PATH
SSMS 옵션을 사용하면 XML
결과 길이를 무제한으로 설정할 수 있습니다 . processing-instruction
비트는 다음과 같은 문자가 문제 방지 <
로 게재를 <
.