2017-01-11 5 views
0

CLR을 호출하고 테이블을 반환하는 저장 프로 시저가 있습니다. 현재, 그것은 단일 문자열을 받아 들일 수 있지만 배열이나 다른 것에서 다중을 허용하도록 업데이트하려고합니다.CLR 함수에서 여러 문자열 수락

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

string[], System.String[], IEnumerable에 매개 변수를 변경하려고하고 ArrayList 모두 실패 : 같은

는 현재의 C# 기능이 보인다. 그 중 하나 만들려고 할 때, 제가 갈거야 것은과 같이 SQL 내 함수를 호출 할 수 있도록, 그것은 중요한 경우

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

에 generated.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