2017-12-12 4 views
0

大きなデータセットの1つのレコードにドリルダウンするより効率的な方法を探しています。毎回、クリーニングプロセスを過ぎたレコードを見つけなければならず、フィールドの1つにいくつかの迷惑データがあります。現在、私はカーソルに戻ってくる、それはひどく非効率的で、データセットをループする。ここで私が話しているかの例です:大きなデータセットの不良レコードをドリルダウンする方法は?

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 

誰もこれが速くなりPROヒントを持っていますか?私はカーソルがほとんどの時に悪いニュースであることを知っていますが、私はピンチで何かを持って来なければなりませんでした...私は次回の準備ができたらいいです。

+3

値が数値でない場合は0を返します。したがって、数値が0の結果セットをフィルタリングするだけで済みます。https://docs.microsoft.com/en-us/sql/t -sql/functions/isnumeric-transact-sql eg '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)は悪名高い[problematic](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年に自分自身で切り替える価値があると数年間語っています! –

関連する問題