技術的には、SQL ServerからCLRコードへのインターフェイスに8000バイトの最大値はありません。 T-SQLラッパーStored ProcまたはFunctionがどのように定義されているかの主な違いです。 CLRコードを呼び出すT-SQLプロシージャまたは関数がRETURNS
をVARBINARY(MAX)
と定義した場合、SqlBytes
またはSqlBinary
をCLRコードの戻り値の型として指定したかどうかにかかわらず、VARBINARY(MAX)
となります。
SqlBytes
とSqlBinary
は両方とも2 GBの制限を処理できますが、違いはCLRコードがどのようにデータを受け入れるかです。 (ちょうどSqlChars
等)SqlBytes
ストリーミングインタフェースを提供するが、それは非常に大きな値のために、より効率的であるかもしれないので(単にSqlString
等)SqlBinary
を一度パラメータ値をとります。 であることをあなたが事前に定義されたSQL関数ラッパーを見ている問題に戻って
、は、Visual Studio(技術的にはSSDT)の D T-SQLを自動生成する方法の問題でした。 SqlBinary
のデフォルト値はVARBINARY(8000)
であり、デフォルト値はSqlBytes
であり、の値はVARBINARY(MAX)
です。同様に、SqlString
のデフォルト値はであり、デフォルト値はSqlChars
であり、はNVARCHAR(MAX)
でした。これらの質問は、はでした。おそらくVisual Studio 2012以降、これらのデータ型の4つすべてに対してデフォルト値がMAX
に変更されました。これは、MAX
タイプと非MAX
タイプを使用した場合、明確なパフォーマンスヒットがあるため、必ずしも良いことではありません。
あなたが関数またはPROCの定義をALTER
することができますので、あなたがVARBINARY
以上の8000バイトまたはNVARCHAR
の4000バイトを必要としない場合は、次のいずれかの方法を使用して、デフォルトを上書きすることになるでしょうVisual Studioによって生成された後、VARBINARY(100)
またはNVARCHAR(50)
などの任意のサイズに(入力パラメータまたは戻り値のいずれかの)データ型を変更することさえできます。
デコレータSqlFacet
デコレータを使用して、Visual Studio/SSDTに、デフォルトではなく、希望するサイズまたはオプションの関数またはProc定義を自動生成するように指示できます。次の例は、(-1
= MAX
なお)入力パラメータと戻り値の両方のサイズを指定する例を示します。あなたは、VARBINARY(1 - 8000)
いずれかにSqlBinary
又はSqlBytes
いずれかのマップを作ることができ、これらの二つの方法のいずれかを使用して
[return: SqlFacet(MaxSize = -1)]
[Microsoft.SqlServer.Server.SqlFunction(Name = "FunctionName")]
public static SqlBinary FuncName([SqlFacet(MaxSize = 50)] SqlString InputParam)
またはVARBINARY(MAX)
。同様に、SqlString
またはSqlChars
のいずれかをNVARCHAR(1 - 4000)
またはNVARCHAR(MAX)
のいずれかにマップすることができます。
Microsoft.SqlServer.Serverを使用しています。 using System.Data.SqlTypes; –