0

Forename、Surname、Address1 などの列を含む SQL テーブルで複雑な文字列操作を実行する必要があるプロセスがあります。

このデータ操作を実行するために、さまざまな SQL CLR C# 関数をセットアップしましたが、行全体を 1 つの CLR 関数または sproc に渡したいと考えています。

これを行う最善の方法は何ですか?

テーブル値パラメーターを作成してから SQL CLR SPROC を作成してデータを受け入れることを考えていますが、データは読み取り専用になりますか、それとも C# でデータ操作を実行して新しいデータ セットを返すことができますか?

何か案は?

4

1 に答える 1

0

TVP (テーブル値パラメーター) を SQLCLR プロシージャーまたは関数に渡すことはできません。それらはデータベースで定義されており、.NET コードはそれらについて何も知りません。

すべてのフィールドをこの関数に渡す場合、この関数はこのテーブルに固有である可能性が高いため、各フィールドを個別の入力パラメーターとして渡すだけではどうですか?

出力にはいくつかのオプションがあります。

  1. 返す値が 1 つしかない場合は、次のように使用できるスカラー関数を作成します。

    UPDATE tbl  
    SET tbl.Field = MyCLRFunction(tbl.Field1, tbl.Field2, tbl.Field3, tbl.Field4)  
    FROM dbo.Table tbl  
    WHERE tbl.Field5 = SomeValue;
    
  2. 複数の値を返す必要がある場合 (ただし、1 つの行であると想定されます)、次のように CROSS APPLY を介して使用できるテーブル値関数を作成します。

    UPDATE tbl  
    SET tbl.Field6 = fnc.FieldA,  
        tbl.Field7 = fnc.FieldB,  
        tbl.Field8 = fnc.FieldC,  
    FROM dbo.Table tbl  
    CROSS APPLY MyCLRFunction(tbl.Field1, tbl.Field2, tbl.Field3, tbl.Field4) fnc  
    WHERE tbl.Field5 = SomeValue;
    

技術的には、これには通常の T-SQL 関数よりも SQLCLR は必要ありませんが、実行する操作によっては、SQLCLR の方が高速になる場合があります。

于 2013-04-19T22:12:28.450 に答える