タイプのパラメータを持つストアドプロシージャを定義し、NVARCHAR(max)
その文字列をで処理しますstored procedure
。最大nvarchar
が4000であることはわかっていますが、5700文字の文字列をエラーなしでspに渡しました。出来ますか?
3 に答える
はい、可能です-MSDNのドキュメントによると:
nvarchar [(n | max)]
可変長Unicode文字列データ。nは文字列の長さを定義し、1から4,000までの値にすることができます。maxは、最大ストレージサイズが2 ^ 31-1バイト(2 GB)であることを示します。ストレージサイズ(バイト単位)は、入力されたデータの実際の長さの2倍+2バイトです。nvarcharのISO同義語は、国別文字が異なり、国別文字が異なります。
したがって、指定すると、最大10億の2バイトUnicode文字nvarchar(max)
を格納できます。それは、100回をはるかに超えるレオ・トルストイの戦争と平和です...。
SQL Serverは、これらの最大列を内部で特別な構造に格納します。これにより、SQLServerページの8Kの制限を回避できます。それは機能しますが、ページに数百バイトを格納するよりも手間がかかるため、このストレージシステムはSQL Serverに大きな負担をかけます。注意して使用し、本当に必要な場合にのみ使用してください(そして最も確実に使用しないでください) 。(n)varchar(max)
怠惰だからといって、すべての列を作成するだけです!)
Simple Talkに関するこの本当に良い記事をチェックしてください:もうVARCHAR(n)を使用するポイントは何ですか?(max)
-データ型がどのように異なり、小さい文字列にはあまり適していないかを非常にうまく説明しています-本当に必要な場合にのみ使用してください!
文字列を連結する場合は、以下のように連結する必要があります。
DECLARE @qry NVARCHAR(MAX);
SET @qry = N'SELECT * FROM Table1 t1';
SET @qry = @qry + N'INNER JOIN Table2 t2 ON t1.Col1 = t2.Col2'
SET @qry = @qry + N'INNER JOIN Table3 t3 ON t1.Col1 = t2.Col3'
EXEC sp_executeSQL @qry
上記の例では、連結された文字列の文字数が4000文字を超えている場合でも、変数に追加され、最大2GBの制限があります。
あなたは試すことができます
Declare @SQL as nvarchar(Max)
,@SQL2 as nvarchar(Max)
-- Just Sample
-- each variable max 4000 character, so be wise in splitting your syntax
Set @SQL = 'Select * '
Set @SQL2 = 'From table A'
EXEC (@SQL+@SQL2)
動的文字列の長さが8000文字を超える場合は、3つの変数に分割する必要があることに注意してください。
私は同じ問題を抱えていたので、これはうまくいくはずです