2009-05-08 10 views
1

SQL CLRユーザー定義関数でデータ型varbinary(MAX)を返すことは可能ですか?それは言及ドキュメントでVarbinary(MAX)を返すCLR UDF

「入力パラメータとrowversion、テキスト、ntext型、イメージを除き、SQL Serverでサポートされているスカラーデータ型のいずれかとすることができるスカラー値関数から返されるタイプ、タイムスタンプ、テーブル、カーソルのいずれかです。 - 彼らはvarbinary型に言及していないが、私はわからないんだけど...

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

ありがとうございます!

答えて

2

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

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

あなたは、Visual Studio経由で展開する場合、あなたはまた、SqlBinaryデータ型を使用することができる一方で、それは、varbinary(8000)いうよりvarbinary(MAX)上にマッピングされます。

+0

Microsoft.SqlServer.Serverを使用しています。 using System.Data.SqlTypes; –

0

答えはイエスであることが表示されます - あなたは「SqlBinary」を返すことで、両方のvarbinary(MAX)を使用することができるか、上記の推奨どおりにSqlBytesを使用することができます。

6

技術的には、SQL ServerからCLRコードへのインターフェイスに8000バイトの最大値はありません。 T-SQLラッパーStored ProcまたはFunctionがどのように定義されているかの主な違いです。 CLRコードを呼び出すT-SQLプロシージャまたは関数がRETURNSVARBINARY(MAX)と定義した場合、SqlBytesまたはSqlBinaryをCLRコードの戻り値の型として指定したかどうかにかかわらず、VARBINARY(MAX)となります。

SqlBytesSqlBinaryは両方とも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タイプを使用した場合、明確なパフォーマンスヒットがあるため、必ずしも良いことではありません。

  1. あなたが関数またはPROCの定義をALTERすることができますので、あなたがVARBINARY以上の8000バイトまたはNVARCHARの4000バイトを必要としない場合は、次のいずれかの方法を使用して、デフォルトを上書きすることになるでしょうVisual Studioによって生成された後、VARBINARY(100)またはNVARCHAR(50)などの任意のサイズに(入力パラメータまたは戻り値のいずれかの)データ型を変更することさえできます。

  2. デコレータ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)のいずれかにマップすることができます。

関連する問題