2017-10-27 6 views
0

我々は列のいずれかがNULL値を変換しようとしたクエリ

以前のコードで
insert into myTable 
select distinct 
    wherefield1, 
    wherefield2, 
    anotherfield, 
    convert(numeric(10,2), varcharfield1), 
    convert(numeric(10,2), varcharfield2), 
    convert(numeric(10,2), varcharfield3), 
    convert(datetime, varcharfield4), 
    otherfields 
from myStagingTable 
where insertflag='true' 
and wherefield1 = @wherevalue1 
and wherefield2 = @wherevalue2 

のような一部のレガシーSQL Server 2005のコード内のステートメントを持って選択し、テーブルへの挿入のSQL Server 2005の期待される動作は何ですかvarcharfield1またはvarcharfield2がヌルであるかどうかを判別する変数が設定され、その内の1つがヌルでない限り、インサートは実行するようにプログラムされています。

我々はvarcharfield1は、varcharfield2、またはvarcharfield3は、数値以外の文字列である場合、例外がスローされますと、挿入が発生しないことを知っています。しかし、しばしばそうであるように、これらの変数の1つがnullの場合、私はその動作に困惑しています。実際には、常にこれらの値の1つがnullの場合があります。しかし、挿入が行われるようです。従来のコードでは、ヌルまたは空の値を挿入できるようにしながら、非数値文字データの挿入のみを防止するようになっています(前の手順では、myStagingTableのこれらのフィールドの空の文字列はすべてnull値に置き換えられます)。

これは数年のためのすべてのデフォルト設定でプロダクションSQL Server 2005のインスタンス上で実行されています。新しいバージョンのSQL Serverにアップグレードする場合、この動作は信頼できますか?

おかげで、

Rebeccah

答えて

1

は何にNULLの変換はまだNULLです。列にNULLが許可されている場合は、それが表示されます。列がNULL可能でない場合、失敗します。

あなたも、INSERTを行うことなく、この自分を見ることができます。これを実行してください:

SELECT CONVERT(numeric(10,2), NULL) 

NULLの結果がどのように生成されるかを確認してください。

SELECT CONVERT(numeric(10,2), 'x') 

をし、それが代わりに何を返すのエラーメッセージがスローされますどのように注意してください。そして、これを実行します。

+0

もちろん、正しいです。エラーログエントリのブーカーの原因として、NULLの変換が試みられましたが、数値以外の文字列の変換が試行されたことが原因です。後で私は、コードの作成者が、エラーを引き起こすのを避けるために空の値をヌルに変換し、人間の眼球によるデータの挿入を防止し、レビューを強制するために非数値文字列変換エラーを残したままにしていたことを認識しました。 – Rebeccah

関連する問題