最大4000のセットがあることを理解しています NVARCHAR(MAX)
あなたの理解は間違っています。nvarchar(max)最大2 GBのデータ(10億の2バイト文字)を(場合によってはそれを超えて)保存できます。
Books onlineのncharとnvarcharから、文法は
nvarchar [ ( n | max ) ]
|文字は、これらの選択肢であることを意味します。つまり、 nまたはリテラルを指定しますmax。
特定を指定することを選択した場合n、これは1から4,000の間である必要がありますが、を使用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)
上記の両方で、文字列の長さがゼロの場合、n1に設定されます。
新しい構文要素。
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切り捨てが発生したことに注意してください。
発生している問題を解決する方法。
2つの非maxデータ型を一緒に連結しているため、またはvarchar(4001 - 8000)文字列をnvarchar型付き文字列(偶数nvarchar(max))に連結しているため、切り捨てられています。
2番目の問題を回避するには、すべての文字列リテラル(または少なくとも4001〜8000の範囲の長さの文字列リテラル)の前にを付けNます。
最初の問題を回避するには、割り当てを
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = 'Foo' + 'Bar' + ...;
に
DECLARE @SQL NVARCHAR(MAX) = '';
SET @SQL = @SQL + N'Foo' + N'Bar'
NVARCHAR(MAX)が最初から連結に関与するようにする(各連結の結果として、NVARCHAR(MAX)これも伝播するため)
表示時の切り捨てを回避する
「グリッドへの結果」モードが選択されていることを確認してください。
select @SQL as [processing-instruction(x)] FOR XML PATH
SSMSオプションを使用すると、XML結果の長さを無制限に設定できます。processing-instructionビットは、次のような文字の問題を回避<として表示します<。