【问题标题】:Accepting multiple strings in CLR function在 CLR 函数中接受多个字符串
【发布时间】:2017-05-26 19:23:00
【问题描述】:

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

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

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

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

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

如果重要的话,我想要的是能够像这样在 SQL 中调用我的函数:

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

【问题讨论】:

  • 听起来您正在考虑一个表值参数(您的查询语法完全错误)。但是 CLR 不支持传递整个数据集。您可以传入一个分隔列表,但不能像您尝试的那样传入一个集合。
  • @SeanLange 我有一种感觉,那就是答案。我想我得另辟蹊径了。
  • 你的 ParseData 方法是做什么的?也就是说,给定一个数组,它会对该数组中的每个元素做同样的事情吗?如果是这样,听起来它是一个 CLR 函数,根据它是标量函数还是表函数,可以在选择列表或交叉应用中调用(分别)。
  • @BenThul 它根据字符串中的各种事物解析一串数据,为解析出的每一项返回一行。你是对的,如果它可以传递一个数组,它本质上只是循环遍历该数组并在每个字符串上运行相同的函数。

标签: c# sql sql-server clr


【解决方案1】:

根据您的 cmets,您可以使用具有 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2014-10-28
    相关资源
    最近更新 更多