2017-12-07 15 views
2

회사 환경에서 데이터를 선택하는 스크립트를 만든 상황이 있습니다. 그렇게하면서, 나는 어떤 경우에 패턴 매칭과 문자 스트립 핑을 위해 함수를 사용하기로 결정했다.사례 제거에서 도움이 필요합니다

그러나 우리 고객 중 한 명이 우리 지역의 환경에 데이터를 저장하는 것을 원하지 않기 때문에 이제 환경에서 실행할 수 있도록 스크립트를 적용해야합니다. 기능을 제거하고, 그렇게하기 위해 물건을 옮길 필요가 있는지 생각하는 데 어려움을 겪고 있습니다.

함수 호출의 예는 다음과 같습니다

Prp는 속성 유형을 포함하고 SerialNumber 일련 번호를 포함하는 열뿐만 아니라, 때문에 다른 임의의 쓰레기 열입니다
SELECT .... 
CASE WHEN Prp = 'Key Cabinet' 
     AND SerialNumber IS NOT NULL 
     AND dbo.fnRemoveNonNumericCharacters(SerialNumber) <> '' 
    THEN dbo.fnRemoveNonNumericCharacters(SerialNumber) 
.... 
INTO #EmpProperty 
FROM .... 

데이터 입력 조잡했다.

함수 정의는 다음과 같습니다

WHILE PATINDEX('%[^0-9]%', @strText) > 0 
BEGIN 
    SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '') 
END 
RETURN @strText 

@strText 내가 전달하고있는 SerialNumber 어디 그냥 좋은 방법을 알아낼 수 없기 때문에

에게 내가 분석 마비에 갇혀 될 수 있습니다

할 수 있습니다. 이. 솔루션별로 풀 필요가 없습니다. 아마도 내가 아는 방향으로 나를 안내 할 것입니다. 몇 가지 샘플 DDL/DML을 사용하여 문제를 해결하고 싶다면 알려주십시오.

예 'SerialNumber'값 : CA100 (Trash bins), T110, 101B. 또한 모든 텍스트 또는 모든 숫자와 같은 다른 유형의 값이 많이 있지만 이러한 값을 필터링합니다. 현재 패턴 일치가 충분합니다.

+0

해당 열에 무엇입니까? 몇 가지 데이터 예제를 줄 수 있습니까? – scsimon

+0

좋은 소리 @scsimon! 나는 안으로 들어갔다. –

답변

2

그래서 나는 아마도 당신이 기능을 사용할 수 없습니다 의미 생각 ... 그래서 :

declare @table table (SomeCol varchar(4000)) 
insert into @table values 
('1 ab2cdefghijk3lmnopqr4stuvwxyz5 6 [email protected]#$8%^&9*()-10_=11+[]{}12\|;:13></14? 15'), 
('CA100 (Trash bins), T110, 101B') 

;with cte as (
    select top (100) 
    N=row_number() over (order by @@spid) from sys.all_columns), 

Final as (
    select SomeCol, Col 
    from @table 
     cross apply (
      select (select X + '' 
      from (select N, substring(SomeCol, N, 1) X 
        from cte 
        where N<=datalength(SomeCol)) [1] 
      where X between '0' and '9' 
      order by N 
      for xml path('')) 
     ) Z (Col) 
    where Z.Col is not NULL 
) 

select 
    SomeCol 
    ,cast(Col as varchar) CleanCol --change this to BIGINT if it isn't too large 
from Final