2017-02-24 9 views
0

私はT-SQLで自分自身を教えているので、この特定の問題とは無関係であっても、すべてのポインタが歓迎されるので、私は自分のコードを書く際に効率を上げることができると確信しています。T-SQLスクリプトのエラーチェック

私が書いた夜間のルーチンで問題が発生しています。初期データを作成しているデータベースプログラムは、私のコントロール外であり、ゆるやかに書かれているので、時折スクリプトを壊す可能性のある悪いデータがあります。私はスクリプトにエラーチェックを追加するための支援を探しているので、全体が爆発するのではなく1つのレコードが失われます。

コードは次のようになります

SELECT convert(bigint,(SUBSTRING(pin, 1, 2)+ SUBSTRING(pin, 3, 4)+ SUBSTRING(pin, 7, 5) + SUBSTRING(pin, 13, 3))) AS PARCEL, taxyear, subdivisn, township, propclass, paddress1, paddress2, pcity 

    INTO [ASSESS].[dbo].[vpams_temp] 

    FROM [ASSESS].[dbo].[Property] 

    WHERE parcelstat='F' 

    GO 

問題は連結が発生し、この最初の部分です。この文字列(11-1111-11111.000)をこの番号(11111111111000)に変換しようとしています。データを正しく入力すると、正確な点と数字の間に正確な句読点があります。彼らが間違いを犯すと、間違った箇所に句読点ができ、数字に変換できない文字列が作成されます。

+0

私の提案は、一時テーブルに文字列を配置することです。その後、ハイフンとピリオドを取り除きます。最後に、整数の文字列のみを使用します。 –

答えて

1

まず、私はreplace()(2回)使用します。第二に、私はtry_convert()を使用します。単に

select pin 
from [ASSESS].[dbo].[Property] 
where pin like '%[^-0-9.]%'; 
+0

私は "try_convert"パートが好きです。それが私が探していたものです。おもう。 try -convertを使用して非適合データに遭遇した場合の動作は何ですか? –

+1

@MattSyvertson try-convertは、そのレコードの変換が失敗した場合にNULLを返し、実行を続行します。そのため、実行時に致命的なエラーが発生することなく、変換可能なすべての値を変換できます。 – scsimon

2

「 - 」と「。」を置き換えるのはどうですか? CONVERTBIGINTの前に「」を付けてください。あなたは、単に

SELECT CONVERT(BIGINT,REPLACE(REPLACE(pin,"-",""), ".","")) AS PARCEL, ... 

であなたのコードの一部を交換することを行うには

はそれがお役に立てば幸いです。

+0

これは妥当と思われますが、そのコードはどのように見えますか?それがこの問題を解決すれば、私はそれを実装したいと思います。さらに、私はこれが修正できない他の連結上の問題を抱えており、それが適合しているかどうかを確認するためにデータをチェックするメソッドがあるかどうかを知りたいと思うでしょう。 C#や他の言語では、行単位で読み込み、行を挿入するには "TRY"を、一致しない場合は1行を拒否します。 –

+0

あなたのGoogle検索文字列は 'sql server replace.'です –

+0

編集されました。コードを試してください –

0

理由だけではない:

select cast(replace(replace('11-1111-11111.000','-',''),'.','') as bigint) 
0

、次のコードを使用します:

SELECT try_convert(bigint, 
        replace(replace(pin, '-', ''), '.', '') 
       ) as PARCEL, 
     taxyear, subdivisn, township, propclass, paddress1, paddress2, pcity 
INTO [ASSESS].[dbo].[vpams_temp] 
FROM [ASSESS].[dbo].[Property] 
WHERE parcelstat = 'F' ; 

はあなたがそこに他の値の文字があるかどうかを確認することをお勧めします -

declare @var varchar(100) 
set @var = '11-1111-11111.000' 
select convert(bigint, replace(replace(@var,'-',''),'.','')) 

結果: -

11111111111000 
関連する問題