1

关于这个问题,这里SQL CLR 返回两个新列我正在尝试创建一个简单的 SQL CLR 函数,我可以在其中将两个字符串传递给函数,并将两个新列传回给我。

所以说我有以下数据: -

Col A     Col B
Bob       Joe
Jane      John

我希望能够将 Col A 和 Col B 传递给 CLR 函数并让它返回类似这样的内容(其中 Col C 和 D 是新列):-

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

我有以下代码: -

 [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];
      }

我可以使用 CREATE ASSEMBLY 在 SQL Server 中注册程序集

我可以在 SQL Server 中创建函数 ok 如下:-

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)
4

2 回答 2

1

我从来没有以这种方式完成 CLR 存储过程,您似乎返回的是一个字符串数组,而不是一个原子字符串。

返回表(c nvarchar null,d nvarchar null)

同样,乍一看,上面的 c 和 d 期待字符串,而不是数组元素。

于 2012-05-04T15:16:00.813 回答
1

Ok 现在已经设法在 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);
    }

}
于 2012-05-08T10:14:02.400 回答