1

SQL CLR ユーザー定義関数がデータ型 varbinary(MAX) を返すことは可能ですか?

ドキュメントでは、次のように言及されています。

「スカラー値関数から返される入力パラメーターと型は、rowversion、text、ntext、image、timestamp、table、または cursor を除く、SQL Server でサポートされている任意のスカラー データ型にすることができます。」-彼らはvarbinaryについて言及していませんが、よくわかりません...

CLRからSQL Serverに返す必要がある.NET側からのバイト配列データがいくつかあり、ストアドプロシージャからの出力パラメーターを使用してそれを行う必要がないようにしています(これが私が持っている方法です)現在テスト中です)。

ありがとう!

4

3 に答える 3

6

技術的には、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型と非型を使用すると明確なパフォーマンス ヒットがあるため、これは必ずしも良いことではありませんMAXVARBINARYしたがって、8000 バイトまたは 4000 バイトを超える が必要ない場合NVARCHARは、次のいずれかの方法を使用してデフォルトをオーバーライドする必要があります。

  1. Function または Proc の定義は、Visual Studio によって生成された後に行うことができALTERます。この場合、データ型 (入力パラメーターまたは戻り値のいずれか) をVARBINARY(100)やなどの任意のサイズに変更することもできますNVARCHAR(50)

  2. デコレータを使用して、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 つの方法のいずれかを使用して、 または を または のいずれかSqlBinarySqlBytesマップできます。同様に、 または をいずれか t またはにマップできます。VARBINARY(1 - 8000)VARBINARY(MAX)SqlStringSqlCharsNVARCHAR(1 - 4000)NVARCHAR(MAX)

于 2011-01-21T22:41:34.803 に答える
2

SqlBytesデータ型を返すように定義すると、これはvarbinary(MAX)SQL Server に正しくマップされます。

[SqlFunction]
public static SqlBytes Function1()
{
    return new SqlBytes(Encoding.UTF8.GetBytes("Hello world."));
}

SqlBinaryデータ型を使用することもできますが、Visual Studio を介してデプロイする場合は、varbinary(8000)ではなくにマップされvarbinary(MAX)ます。

于 2009-05-08T17:02:22.663 に答える
0

答えは「はい」のようです。「SqlBinary」を返すことで両方のvarbinary(MAX)を使用するか、上記で推奨されているようにSqlBytesを使用できます。

于 2009-05-08T18:51:01.513 に答える