2012-05-04 5 views
1

ここでこの質問に関してSQL CLR return two new columns私は関数に2つの文字列を渡すことができ、2つの新しい列を返す簡単なSQL CLR関数を作成しようとしています。私はCLR機能にコルAとコルBに合格できるようにしたいと、それはコルCとDであることにより、(このような何かを返す必要がありSQL Server CLR 2つの新しい列をデータフローに返すためのTVF

Col A  Col B 
Bob  Joe 
Jane  John 

- :

は、だから私は、次のデータを持っていると言います新しい列): - 私は次のコードを持っている

Col A  Col B  Col C  Col D 
Bob  Joe  BobCLR JoeCLR 
Jane  John  JaneCLR JohnCLR 

: - 私はSQLでアセンブリを登録することができます

[SqlFunction(FillRowMethodName = "FillRow")] 
    public static IEnumerable MyCLRFunction(string A, string B) 
    { 
     String[] values = new String[2]; 
     values[0] = A+"CLR"; 
     values[1]= B+"CLR"; 

     return values; 
    } 

     private static void FillRow(Object obj, out string C, out string D) 
     { 
      String[] row = (object[])obj; 
      C = (string)row[0]; 
      D = (string)row[1]; 
     } 

をサーバー[OK]を次のように私は、SQL ServerでOK関数を作成することができますASSEMBLY

をCREATE使用: -

CREATE FUNCTION dbo.MyCLRFunction(@a [nvarchar](4000), @b [nvarchar](4000)) 
RETURNS TABLE 
(c [nvarchar](4000) null, d [nvarchar](4000) null) with execute as caller 
AS 
EXTERNAL NAME [MyNamespace].[CLRFunctions].[MyCLRFunction] 

しかし私が行うとき: - 取得

SELECT * FROM MyCLRFunction('Bob','Joe') 

イム: -

Msg 6260, Level 16, State 1, Line 1 
An error occurred while getting new row from user defined Table Valued Function : 
System.InvalidCastException: Unable to cast object of type 'System.String' to type 'System.String[]'. 
System.InvalidCastException: 
    at CLRFunctions.FillRow(Object obj, String& C, String& D) 

答えて

1

これで、Ienumerable内でKeyValuePairを使用してこれを行うことができました。

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.Data.SqlTypes; 
using Microsoft.SqlServer.Server; 

public class CLRFunctions 
{ 

    private static IEnumerable<KeyValuePair<double, double>> CoordinatesEnumerable(double Lat, double Long) 
    { 
     return new Dictionary<double, double> { { Lat, Long } }; 
    } 

    [SqlFunction(FillRowMethodName = "FillRow")] 
    public static IEnumerable ToLatLong(double East, double North) 
    { 
     return CoordinatesEnumerable(East, North); 
    } 

    private static void FillRow(Object obj, out SqlDouble Lat, out SqlDouble Long) 
    { 
     KeyValuePair<double, double> Coordinates = (KeyValuePair<double, double>)obj; 
     Lat = new SqlDouble(Coordinates.Key); 
     Long = new SqlDouble(Coordinates.Value); 
    } 

} 
1

私は決してCLR sprocをやったことがありません。アトミックな文字列ではなく文字列配列を返すように見えます。表 (CのNVARCHARヌル、D NVARCHARヌル)再び

戻り、ちょうど一見、上記でCおよびDは、文字列ではなく、配列の要素を期待しています。

関連する問題