2012-03-05 3 views
3

DLL에서 정적 변수를 사용하는 것이 안전하지 않다고 생각하지만 비슷한 방법이 있거나 현재 컨텍스트에만 존재하는 변수가있는 방법이 있습니까?SQL CLR - 현재 컨텍스트에 대한 "정적"변수

쉼표로 구분 된 문자열을 사용하고 두 개의 열이있는 테이블을 반환하는 UDF를 만들려고합니다. 하나는 원래 문자열의 값의 인덱스/순서이고, 다른 하나는 값 그 자체. 분할은 쉽습니다 (코드 예제는 온라인에 많이 있습니다).하지만 명령을 내리는 것은 불가능 해 보입니다.

IDENTITY 열을 사용해 보았지만 허용되지 않습니다 ("스트리밍 사용자 정의 함수의 결과 테이블에서 IDENTITY 열을 사용할 수 없음"). 정적 vaiable을 사용하는 것은 이동하지 않습니다. . 웹 프로젝트에서 System.Web.HttpContext.Current을 얻습니다. SQL 프로젝트와 비슷한 것이 있습니까? 아니면 제가 찾고있는 것을하기위한 더 좋은 방법이 있습니까?

SQL

CREATE FUNCTION SplitToInt(@list nvarchar(MAX), @delim nchar(1) = N',') 
RETURNS TABLE (Value int) 
AS EXTERNAL NAME CompanyName.Functions.SplitToInt 
GO 

C#을

[SqlFunction(FillRowMethodName = "SplitToIntFillRow")] 
public static IEnumerable SplitToInt(SqlString str, SqlString separator) 
{ 
    return str.Value.Split(!separator.IsNull && separator.Value.Length > 0 ? separator.Value[0] : ','); 
} 

public static void SplitToIntFillRow(object row, out int Value) 
{ 
    Value = System.Convert.ToInt32((string)row); 
} 
+0

SQL 테이블 함수를 사용할 수 없습니까? – mslliviu

+0

기본적으로 원본 색인을 검색하는 방법을 알아낼 수 없습니까? – sll

+0

@list 변수는 C#에서 비롯된 것이므로 기본적으로'SELECT * FROM table WHERE id IN (@list) ORDER BY @ list'를 사용해야합니다. – Jocie

답변

1

내 솔루션 (필기구 다운, 멀리 걸어, 그리고 돌아 오는 방법 재미는 명백한을 볼 수 있습니다)

SQL

CREATE FUNCTION SplitToInt(@list nvarchar(max), @separator nchar(1) = N',') 
RETURNS TABLE (InLevelOrder int, Value int) 
AS EXTERNAL NAME CompanyName.Functions.SplitToInt 
GO 

C#

[SqlFunction(FillRowMethodName = "SplitToIntFillRow")] 
public static IEnumerable SplitToInt(SqlString str, SqlString separator) 
{ 
    var s = str.Value.Split(!separator.IsNull && separator.Value.Length > 0 ? separator.Value[0] : ','); 
    var rtn = new List<int[]>(s.Length); 
    for (int i = 0; i < s.Length; i++) 
     rtn.Add(new[] { i, System.Convert.ToInt32(s[i]) }); 
    return rtn; 
} 

public static void SplitToIntFillRow(object row, out int InLevelOrder, out int Value) 
{ 
    InLevelOrder = ((int[])row)[0]; 
    Value = ((int[])row)[1]; 
} 

누구나 개선 할 수 있다면 언제든지 말씀해주십시오.

+0

'SplitToInt()'함수에서'str' 값과 yield를 반복하면 결과를 얻을 수있다. 스트리밍되다. (약간 조숙 한 최적화 일 수도 있습니다) –

+0

당신이 말한 내용이 의미하는 바를 이해하지 못합니다 – Jocie

+0

이것에 관한 좋은 관련 블로그 게시물입니다 : http://sqlblog.com/blogs/adam_machanic/archive/2009/04 /26/faster-more-scalable-sqlclr-string-splitting.aspx –

관련 문제