技術的には、SQL Server から CLR コードへのインターフェイスに 8000 バイトの最大値はありません。これは主に、T-SQL ラッパーの Stored Proc または Function の定義方法の違いです。つまり、CLR コードを呼び出す T-SQL Proc または Function がRETURNSasを定義している場合、CLR コードの戻り値の型としてまたはを指定したかどうかに関係なく、VARBINARY(MAX)それは になります。VARBINARY(MAX)SqlBytesSqlBinary
SqlBytesとはどちらもSqlBinary2 GB の制限を処理できますが、違いは CLR コードがデータを受け入れる方法にあります。SqlBinary( のようにSqlString) はパラメーター値を一度にすべて取得しますが、SqlBytes(のようにSqlChars) はストリーミング インターフェイスを提供するため、非常に大きな値に対してより効率的である可能性があります。
定義済みの SQL 関数ラッパーで発生している問題に戻ります。はVisual Studio (技術的には SSDT) がどのように自動生成するかの問題でしたsT-SQL を実行します。のデフォルトSqlBinary はVARBINARY(8000)のデフォルトでしたSqlBytes はでしたVARBINARY(MAX)。同様に、SqlString はNVARCHAR(4000)のデフォルトでしたSqlChars はでしたNVARCHAR(MAX)。これらは、この質問が尋ねられたときのデフォルトでした。おそらく Visual Studio 2012 以降ではMAX、これら 4 つのデータ型すべてを使用するようにデフォルトが変更されました。MAX型と非型を使用すると明確なパフォーマンス ヒットがあるため、これは必ずしも良いことではありませんMAX。VARBINARYしたがって、8000 バイトまたは 4000 バイトを超える が必要ない場合NVARCHARは、次のいずれかの方法を使用してデフォルトをオーバーライドする必要があります。
Function または Proc の定義は、Visual Studio によって生成された後に行うことができALTERます。この場合、データ型 (入力パラメーターまたは戻り値のいずれか) をVARBINARY(100)やなどの任意のサイズに変更することもできますNVARCHAR(50)。
デコレータを使用して、SqlFacetVisual Studio / SSDT に、デフォルトではなく好みのサイズ オプションで Function または Proc 定義を自動生成するように指示できます。-1次の例は、入力パラメーターと戻り値の両方のサイズを指定する方法を示しています ( =であることに注意してくださいMAX)。
[return: SqlFacet(MaxSize = -1)]
[Microsoft.SqlServer.Server.SqlFunction(Name = "FunctionName")]
public static SqlBinary FuncName([SqlFacet(MaxSize = 50)] SqlString InputParam)
これら 2 つの方法のいずれかを使用して、 または を または のいずれかSqlBinaryにSqlBytesマップできます。同様に、 または をいずれか t またはにマップできます。VARBINARY(1 - 8000)VARBINARY(MAX)SqlStringSqlCharsNVARCHAR(1 - 4000)NVARCHAR(MAX)