2016-07-08 3 views
1

私は2つのシステム間でデータを集計するシナリオを持っています。残念ながら私はVisual Studioでテーブルアダプターを使用しています。上記の場合where句でキャストを行ってから別のフィールドを最初にチェックすると失敗しますか?

Select * from prsnpsht where Cast(snp_check as bigint) > 10 and sourcereference Is Null 
Union ALL 
    Select * from prsnpsht where sourcereference is not null 

、最初のシステムからsnp_checkが正しくBIGINTするsnp_checkでキャストし、我々はsourcereferenceがnullであるため、データが最初にシステムから知っているだろう、すべての数値になります。 2番目のシステムはsnp_checkフィールドに他の文字を持つことができ、bigintにキャストしようとすると失敗します。

私はクエリの構造をそのままにしておくと、ソース参照条件を分析する前にすべてのチェックを大きなintにキャストしようとしますか、SQL Serverはデータを制限する必要があることを十分に知っていますそれはsnp_checkフィールドをキャストしようとする前に?

これは重複した質問であれば事前にお詫びしますが、以前に回答があった場合は見つけられませんでした。

+0

クエリで参照される「2つのシステム」が表示されません。 –

+0

@ GordonLinoff質問が論理短絡に関するものだと思うが、その懸念を避けるためにクエリを書き直すことができる。 – DavidG

+0

同じテーブルに書き込む2つのシステムがあります。 snp_checkフィールドは、両方を可能にするnvarchar(25)です。クエリはレポートのためのものです。 –

答えて

0

私はこのクエリのためと推測している:

Select * 
from prsnpsht 
where Cast(snp_check as bigint) > 10 and sourcereference Is Null; 

あなたは変換エラーを取得しています。 SQL Serverの2012+では

、解決策はtry_convert()を使用することです:

以前のバージョンでは
Select * 
from prsnpsht 
where try_convert(bigint, snp_check) > 10 and sourcereference Is Null; 

caseを使用します。

Select * 
from prsnpsht 
where (case when snp_check not like '%[^0-9]%' 
      then convert(bigint, snp_check) 
     end) > 10 and 
     sourcereference Is Null; 
+0

ソース照会をこのクエリから除外し、 'try_convert(bigint、snp_check)> 10を使用すると、アルファベット文字を含むsnp_checkの結果も返されますか? –

+0

try_convertは、変換できない場合はnullを返します。null> 10 = false – MWillemse

+0

@JohnJanssen。 。 。そうでない場合、 'try_convert()'は 'NULL'を返し、'> 10 'との比較は失敗します。 –

0

SQL Serverのバージョンは2012以上であるのIFしてみてください次のクエリ

Select * from prsnpsht where try_convert(bigint,snp_check) > 10 and sourcereference Is Null 
Union ALL 
    Select * from prsnpsht where sourcereference is not null 

Try_Convert()はを返します値がsnp_checkが無効なBigintデータの場合

関連する問題