最大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)
上記の両方で、文字列の長さがゼロの場合、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
切り捨てが発生したことに注意してください。
発生している問題を解決する方法。
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
ビットは、次のような文字の問題を回避<
として表示します<
。