NVARCHAR(MAX)
に4000の最大セットがあることを理解しています
あなたの理解は間違っています。 nvarchar(max)
最大(場合によってはそれ以上)の2GBのデータ(10億の2バイト文字)を保存できます。
Booksonlineの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
に無制限の長さを設定できます 結果。 処理命令
ビットは、<
などの文字の問題を回避します &lt;
として表示されます 。