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;として表示されます 。