2016-08-31 1 views
0

SQL Serverに奇妙な問題があります。基本的には、2つの列、Description 1Description 2を持つジェネリック型オブジェクトがあります。 Description2が数字であるかどうかをチェックし、数字であれば値をチェックしてください/それを使用してください。ただし、クエリを実行しようとすると、次のエラーが表示されます。数値がまだエラーをスローするかどうかを確認する

nvarchar値 'Test Other'をデータ型intに変換すると、変換に失敗しました。

は今、通常、私は単にそれが不適切な値に/ etcに参加しようとしたことを前提としていますが、varcharが、それは誤りで言っていることはISNUMERICから有効であってはなりません。ここで

は、私のクエリのサンプルです:

SELECT * 
FROM base_table 
JOIN org_type o ON o.id = base_table.org_id 
LEFT JOIN generic_object go ON go.id = base_table.org_id AND ISNUMERIC(description2) 
WHERE description2 = @orgId 
    AND base_table.id = @baseId 

は、私は、クエリからの最後の行を削除すると、私はエラーを受信しません、私には不思議な何かです。

+0

どのように '@ baseId'を定義しましたか?データ型と値の両方を教えてください。 –

+0

この目的のために、値は可変ですが、私のシステムでは現在それぞれ2535と2357に設定されています。 – Sh4d0wsPlyr

+0

報告された問題の値 "Test Other"がどこから来たのか分かりますか? –

答えて

2

数字のdescription2レコードのみを返すには、インラインビューを使用します。この方法では、最初に数値のみを含むデータセットを解決する必要があります。

SELECT * 
FROM base_table 
JOIN org_type o ON o.id = base_table.org_id 
LEFT JOIN (SELECT * 
      FROM generic_object 
      WHERE isNumeric(description2)) go ON go.id = base_table.org_id 
WHERE description2 = @orgId 
    AND base_table.id = @baseId 
0

私には、description2 = @orgIdが問題であるようです。 JOINでISNUMERIC(description2)をチェックしている場合、取得している他の結果はその列の数値になりません。だからWhere句はあなたにエラーを与えています。 ISNUMERIC(description2) = 1をWhere句に移動してみてください。

+0

これを試行しました - 同じ問題です。 – Sh4d0wsPlyr

2

私はこの種の結合を見たことがありません...しかし、これはあなたに望ましい結果をもたらすと思います。まず、結合からISNUMERICを削除します。私は基本的にnumericである場合に限り、変数をdescription2と比較し、そうでない場合は常にそれを自分自身と比較します。これは常に真です。

WHERE ISNULL(@orgId,'') = case when ISNUMERIC(description2) = 1 then description2 else ISNULL(@orgId,'') end 
+0

これは私にとってはうまくいくようですが、これは他のクエリの問題もありましたが、これは同時に私に見せましたが、一般的な考え方は完全に機能し、前進することができました。おかげで – Sh4d0wsPlyr

+0

@ Sh4d0wsPlyr – scsimon

関連する問題