技術的には、SQL Server から CLR コードへのインターフェイスに 8000 バイトの最大値はありません。これは主に、T-SQL ラッパーの Stored Proc または Function の定義方法の違いです。つまり、CLR コードを呼び出す T-SQL Proc または Function がRETURNS
asを定義している場合、CLR コードの戻り値の型としてまたはを指定したかどうかに関係なく、VARBINARY(MAX)
それは になります。VARBINARY(MAX)
SqlBytes
SqlBinary
SqlBytes
とはどちらもSqlBinary
2 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)
。
デコレータを使用して、SqlFacet
Visual 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)
SqlString
SqlChars
NVARCHAR(1 - 4000)
NVARCHAR(MAX)