2011-11-24 2 views
1

설명과 달러 금액이 혼합 된 입력란이 있습니다. TSQL을 사용하여 그 금액을 추출한 다음이를 레코드의 새 필드에 삽입하고 싶습니다.기존 SQL 데이터에서 달러 금액을 추출 하시겠습니까?

- UPDATE -

일부 데이터 샘플 수 : 난 그냥 달러 그림의 첫 번째 발생을 잡는 생각했다 위에 그 간단한입니다 ... 세트에서

Used knife set for sale $200.00 or best offer. 
$4,500 Persian rug for sale. 
Today only, $100 rebate. 
Five items for sale: $20 Motorola phone car charger, $150 PS2, $50.00 3 foot high shelf. 

.

원본 텍스트에서 금액을 삭제하지 않고 값을 가져 와서 새 필드에 추가하려고하지 않습니다.

금액에는 십진수와 쉼표가 포함될 수 있습니다.

나는 PATINDEX가 그것을 자르지 않을 것이고, 이것을 달성하기 위해 극도로 RegEx 함수를 필요로하지 않을 것이다.

그러나, OLE 정규식 찾기보고 (실행) 기능 here는 것으로 보인다 가장 강력한, 내가 SSMS에서 다음과 같은 오류 메시지가 얻을 기능을 사용하려고하지만 때

SQL 서버 차단을 이 구성 요소가이 서버의 보안 구성 부분 인 으로 해제되어 있기 때문에 구성 요소 'Ole Automation Procedures'의 'sys.sp_OACreate'프로 시저에 액세스 할 수 없습니다. 시스템 관리자는 에 의해 'Ole Automation Procedures'를 sp_configure를 사용하여 활성화 할 수 있습니다. 'Ole 자동화 절차'를 사용하도록 설정하는 방법에 대한 자세한 내용은 SQL Server 온라인 설명서의 "노출 영역 구성"을 참조하십시오.

이 기능을 사용하기 위해 서버 설정을 변경하고 싶지 않습니다. 나는 변화없이 잘 작동하는 또 다른 정규식 함수를 가지고있다.

나는 이것이 달러 금액을 추출하기 위해 복잡하다는 것을 상상할 수 없습니다. 더 간단한 방법?

감사합니다.

+1

열 내용의 샘플을 제공 할 수 있습니까? –

+0

OLE보다 CLR regexp 구현을 사용하는 것이 좋습니다. http://www.codeproject.com/KB/string/SqlRegEx.aspx t-sql이 작업에 적합하지 않으면 –

+0

Alex가 옳습니다. 아마도 C#을 사용하여 자신의 문자열 추출 함수를 작성한 다음 CLR을 사용하여 SQL 코드로 가져 오는 것이 더 빠를 것입니다. 서버에서 CLR을 사용하면 부작용이 발생해서는 안됩니다. – deutschZuid

답변

2
CREATE FUNCTION dbo.fnGetAmounts(@str nvarchar(max)) 
    RETURNS TABLE 
    AS 
    RETURN 
    (
    -- generate all possible starting positions (1 to len(@str)) 
    WITH StartingPositions AS 
    (
     SELECT 1 AS Position 
     UNION ALL 
     SELECT Position+1 
     FROM StartingPositions 
     WHERE Position <= LEN(@str) 
    ) 
    -- generate possible lengths 
    , Lengths AS 
    (
     SELECT 1 AS [Length] 
     UNION ALL 
     SELECT [Length]+1 
     FROM Lengths 
     WHERE [Length] <= 15 
    ) 
    -- a Cartesian product between StartingPositions and Lengths 
    -- if the substring is numeric then get it 
    ,PossibleCombinations AS 
    (

     SELECT CASE     
       WHEN ISNUMERIC(substring(@str,sp.Position,l.Length)) = 1 
        THEN substring(@str,sp.Position,l.Length)   
       ELSE null END as Number 
       ,sp.Position 
       ,l.Length 
     FROM StartingPositions sp, Lengths l   
     WHERE sp.Position <= LEN(@str)    
    ) 
-- get only the numbers that start with Dollar Sign, 
-- group by starting position and take the maximum value 
-- (ie, from $, $2, $20, $200 etc) 
    SELECT MAX(convert(money, Number)) as Amount 
    FROM PossibleCombinations 
    WHERE Number like '$%' 
    GROUP BY Position 
    ) 

    GO 

    declare @str nvarchar(max) = 'Used knife set for sale $200.00 or best offer. 
    $4,500 Persian rug for sale. 
    Today only, $100 rebate. 
    Five items for sale: $20 Motorola phone car charger, $150 PS2, $50.00 3 foot high shelf.' 

    SELECT * 
    FROM dbo.fnGetAmounts(@str) 
    OPTION(MAXRECURSION 32767) -- max recursion option is required in the select that uses this function 
+0

정말 멋집니다. 나는 내가 찾고 있었던 것에 대한 과잉의 것이지만, 대단하다! 나중에 사용할 수 있도록 db에 함수를 추가했습니다. 감사! – ElHaix

+0

환영합니다. CLR 기능은 큰 세트/텍스트에서 더 잘 작동합니다. –

관련 문제