C# 在CLR函数中接受多个字符串

C# 在CLR函数中接受多个字符串,c#,sql,sql-server,clr,C#,Sql,Sql Server,Clr,我有一个调用CLR并返回表的存储过程。目前,它只接受一个字符串,但我想将其更新为接受多个字符串,可能是在一个数组中 目前,C#函数如下所示: public static IEnumerable ParseData(System.String data){ ... } 尝试将参数更改为string[],System.string[],IEnumerable和ArrayList均失败。当尝试使用其中一个进行构建时,它会将生成的.sql文件更改为 CREATE FUNCTION [dbo].[Par

我有一个调用CLR并返回表的存储过程。目前,它只接受一个字符串,但我想将其更新为接受多个字符串,可能是在一个数组中

目前,C#函数如下所示:

public static IEnumerable ParseData(System.String data){ ... }
尝试将参数更改为
string[]
System.string[]
IEnumerable
ArrayList
均失败。当尝试使用其中一个进行构建时,它会将生成的.sql文件更改为

CREATE FUNCTION [dbo].[ParseData] (@data /* Error: Unsupported type. */)
如果这很重要,我要做的是能够在SQL中调用我的函数,如下所示:

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

根据您的注释,您可以使用签名为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

听起来您正在考虑一个表值参数(您的查询语法完全错误)。但是CLR不支持传递整个数据集。您可以传入带分隔符的列表,但不能传入您试图传入的集合。@SeanLange我觉得这就是答案。我想我必须找到一种不同的方法。你的ParseData方法做什么?也就是说,给定一个数组,它会对该数组中的每个元素执行相同的操作吗?如果是这样,听起来像是一个CLR函数,根据它是标量函数还是表函数,可以在选择列表中调用,也可以使用交叉应用(分别)调用。@BenThul它根据字符串中的各种内容解析一个数据字符串,为解析出的每个项返回一行。如果可以向它传递一个数组,那么它实际上只是在该数组中循环,并在每个字符串上运行相同的函数,这是正确的。