2017-12-12 15 views
0

큰 데이터 세트에서 하나의 레코드를 드릴 다운하는보다 효율적인 방법을 찾고 있습니다. 가끔씩 나는 청소 과정을 지나치는 기록을 발견해야하고 필드 중 하나에 약간의 쓰레기 데이터가 있습니다. 현재 나는 커서 위로 떨어지는 바람에 비효율적으로 데이터 세트를 반복합니다. 다음은 내가 말하고자하는 내용의 예입니다.큰 데이터 세트의 잘못된 레코드를 드릴 다운하는 방법은 무엇입니까?

CREATE TABLE #t(
PK INT PRIMARY KEY IDENTITY(1,1), 
SomeVal VARCHAR(50) NULL 
) 

INSERT INTO #t(SomeVal) 
VALUES('1.2'),('3.4'),('5.6'),('7.8 Junk.....') 


DECLARE x CURSOR FOR SELECT PK, SomeVal FROM #t 
DECLARE @y INT 
DECLARE @z VARCHAR(50) 

OPEN x 
FETCH NEXT FROM x INTO @y, @z 

WHILE @@FETCH_STATUS = 0 
    BEGIN 
     BEGIN TRY 
      SELECT CAST(@z AS MONEY) --Create the error 
     END TRY 
     BEGIN CATCH 
      PRINT('The Primary key is: ' + CAST(@y AS VARCHAR(50)) + ' and the offending value is: ' + @z) --Catch the records primary key and the value that causes the error 
     END CATCH 

     FETCH NEXT FROM x INTO @y, @z 
    END 

CLOSE x 
DEALLOCATE x 
DROP TABLE #t 

누구보다 빠른 속도의 전문가 팁이 있습니까? 나는 커서가 대부분의 시간에 나쁜 소식이지만 핀치로 뭔가를 가져야 만한다는 것을 알고 있습니다. 나는 다음에 그것이 생길 때 더 잘 준비하고 싶습니다.

+3

값이 숫자가 아닌 경우 0을 반환하므로 숫자가 0 인 결과 집합 만 필터링하면됩니다. https://docs.microsoft.com/en-us/sql/t -sql/functions/isnumeric-transact-sql 예 'select * from table wherenumeric (offending_column) = 0' – Charleh

+0

@Charleh IsNumeric 함수를 살펴 봤지만, 내가 좋아하지 않는 것은 ms 문서가 달러 기호가 있으면 1을 반환한다고 말합니다. 들. 그것은 대부분의 경우에 문제를 일으키지 않을 수도 있지만 그것이 내 문제가 될 것입니다. 그래도 좋은 솔루션. – BillRuhl

+0

@Charleh ['IsNumeric()'] (https://docs.microsoft.com/en-us/sql/t-sql/functions/isnumeric-transact-sql)는 악명 높다 [문제가되는] (http : // www .sqlservercentral.com/articles/ISNUMERIC()/71512 /). – HABO

답변

2

TRY_CAST/TRY_CONVERT은 실패시 NULL을 반환하며 해당 시나리오에 맞게 특별히 설계되었습니다.

SELECT TRY_CAST(@z AS MONEY) 
+0

감사합니다. 이것이 내가 프로에게 묻는 이유입니다 ... TRY_CAST 함수를 본 적이 없습니다 ... 더 좋은 방법! – BillRuhl

+0

그래, try_cast/try_convert가 2008R2에서 2012 년으로 전환 할 가치가 있다고 수년 동안 말했어! –