最大4000のセットがあることを理解していますNVARCHAR(MAX)
あなたの理解は間違っています。nvarchar(max)
最大(場合によってはそれ以上)の2GBのデータ(10億の2バイト文字)を保存できます。
Books onlineのncharとnvarcharから、文法は次のようになります。
nvarchar [ ( n | max ) ]
|
文字は、これらが選択肢であることを意味します。つまり、またはリテラルのいずれ かを指定します。n
max
特定を指定する場合n
、これは1〜4,000である必要がありますが、を使用max
すると、それがラージオブジェクトデータ型(ntext
非推奨の置換)として定義されます。
実際、SQL Server 2008では、変数tempdb
の場合、 (ここに表示されている)の十分なスペースを条件として、2GBの制限を無期限に超えることができるようです。
あなたの質問の他の部分について
連結時の切り捨ては、データ型によって異なります。
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
切り捨てが発生したことに注意してください。
発生している問題を解決する方法。
max
2つの非データ型を連結しているため、または文字列を型指定された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
などの文字の問題を回避します。<
<