在CLR函数

时间:2017-01-11 20:48:35

标签: c# sql sql-server clr

我有一个调用CLR的存储过程并返回一个表。目前,它接受一个字符串,但我想更新它以接受多个,可能在数组或其他东西。

目前,C#功能如下:

public static IEnumerable ParseData(System.String data){ ... }

尝试将参数更改为string[]System.String[]IEnumerableArrayList都已失败。当尝试使用其中一个进行构建时,它会将generated.sql文件更改为

CREATE FUNCTION [dbo].[ParseData] (@data /* Error: Unsupported type. */)

如果它很重要,我的目的是能够在SQL中调用我的函数:

SELECT * FROM clr_parseData((SELECT TOP 10 value FROM table))

1 个答案:

答案 0 :(得分:1)

根据您的注释,您可以使用具有System.String签名的现有函数(单数,而不是数组)。你可以这样做:

select *
from (
    values 
        ('foo,bar'),
        ('bar,baz')
) as a(v)
cross apply dbo.ParseData(a.v) as p

这里,表值构造函数只是我生成一组数据的简短方法。 SQL将对集合中的每个值应用您的函数并生成数据集。假设dbo.ParseData执行简单的操作,例如"解析CSV" (这就是我在我的例子中所做的事情!),之前的查询将产生一个像

这样的数据集
foo,bar foo
foo,bar bar
bar,baz bar
bar,baz baz