2017-01-11 55 views
0

我有一個調用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

聽起來你正在考慮估值表參數(您的查詢語法全部錯誤)。但CLR不支持傳遞整個數據集。你可以傳入一個分隔列表,但你不能傳入你想要的集合。 –

+0

@SeanLange我有一種感覺,那就是答案。猜猜我必須找到一種不同的方式。 –

+0

你的ParseData方法有什麼作用?也就是說,給定一個數組,它會爲該數組中的每個元素做同樣的事情嗎?如果是這樣,這聽起來像是一個CLR函數,根據它是標量函數還是表函數,可以在選擇列表中調用或分別使用交叉應用調用。 –

回答

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 
相關問題