大きなデータセットの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ヒントを持っていますか?私はカーソルがほとんどの時に悪いニュースであることを知っていますが、私はピンチで何かを持って来なければなりませんでした...私は次回の準備ができたらいいです。
値が数値でない場合は0を返します。したがって、数値が0の結果セットをフィルタリングするだけで済みます。https://docs.microsoft.com/en-us/sql/t -sql/functions/isnumeric-transact-sql eg '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)は悪名高い[problematic](http:// www .sqlservercentral.com/articles/ISNUMERIC()/ 71512 /)。 – HABO