큰 데이터 세트에서 하나의 레코드를 드릴 다운하는보다 효율적인 방법을 찾고 있습니다. 가끔씩 나는 청소 과정을 지나치는 기록을 발견해야하고 필드 중 하나에 약간의 쓰레기 데이터가 있습니다. 현재 나는 커서 위로 떨어지는 바람에 비효율적으로 데이터 세트를 반복합니다. 다음은 내가 말하고자하는 내용의 예입니다.큰 데이터 세트의 잘못된 레코드를 드릴 다운하는 방법은 무엇입니까?
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
누구보다 빠른 속도의 전문가 팁이 있습니까? 나는 커서가 대부분의 시간에 나쁜 소식이지만 핀치로 뭔가를 가져야 만한다는 것을 알고 있습니다. 나는 다음에 그것이 생길 때 더 잘 준비하고 싶습니다.
값이 숫자가 아닌 경우 0을 반환하므로 숫자가 0 인 결과 집합 만 필터링하면됩니다. https://docs.microsoft.com/en-us/sql/t -sql/functions/isnumeric-transact-sql 예 'select * from table wherenumeric (offending_column) = 0' – Charleh
@Charleh IsNumeric 함수를 살펴 봤지만, 내가 좋아하지 않는 것은 ms 문서가 달러 기호가 있으면 1을 반환한다고 말합니다. 들. 그것은 대부분의 경우에 문제를 일으키지 않을 수도 있지만 그것이 내 문제가 될 것입니다. 그래도 좋은 솔루션. – BillRuhl
@Charleh ['IsNumeric()'] (https://docs.microsoft.com/en-us/sql/t-sql/functions/isnumeric-transact-sql)는 악명 높다 [문제가되는] (http : // www .sqlservercentral.com/articles/ISNUMERIC()/71512 /). – HABO