1

これは私が直面している非常に奇妙な問題です。次のクエリを実行すると:

select p1.*  
from art_asset as p0 
inner join  
   (select   
       t0.art_asset_id as Id, t0.Host, 
       convert(INT, substring(t0.host, len(rtrim(t0.host)) -1 , 2)) as Number    
    from art_asset t0   
    where t0.manufacturer = 'McAfee' and decommissioned = 0) as p1 on p1.Id = p0.art_asset_id

3 つの列が返され、すべてが見た目とまったく同じように見えます。Id列、Host列、および列を取得しNumberます。

ただし、次のように、このクエリの最後に where 句を追加すると:

select p1.*  
from art_asset as p0 
inner join  
   (select
       t0.art_asset_id as Id, t0.Host, 
       convert(INT, substring(t0.host, len(rtrim(t0.host)) -1 , 2)) as Number    
    from art_asset t0   
    where t0.manufacturer = 'McAfee' and decommissioned = 0 ) as p1 on p1.id = p0.art_asset_id
where p1.Number <> 1

次のエラーが表示されます!?!

メッセージ 245、レベル 16、状態 1、行 1
varchar 値 '1Z' をデータ型 int に変換するときに変換に失敗しました。

データのサンプルを次に示します。

| Id    | Host                | Number |
----------------------------------------
| 1     | DEVICENAME80        | 80     |
| 2     | DEVICENAME81        | 81     |
| 3     | DEVICENAME60        | 60     |
4

3 に答える 3

0

問題は、変換が不要なときに実行するように最適化されていることです。これをチェックしてください

于 2012-11-13T18:25:39.817 に答える
0

CONVERT は where 句で機能するため、元のクエリは機能するはずです。

SELECT
  art_asset_id as Id, 
  Host, 
  CONVERT(INT, SUBSTRING(host, len(rtrim(host)) -1 , 2)) as Number    
FROM art_asset  
WHERE manufacturer = 'McAfee'
  AND decommissioned = 0
  AND CONVERT(INT, SUBSTRING(host, len(rtrim(host)) -1 , 2)) <> 1

しかし、この CONVERT ステートメントが失敗すると言ったので、暗黙的な変換を利用する WHERE 句も機能します。

WHERE manufacturer = 'McAfee'
  AND decommissioned = 0
  AND SUBSTRING(host, len(rtrim(host)) -1 , 2) <> 1
于 2012-11-13T18:15:43.440 に答える
0

where 句を次のように変更してみてください。

  WHERE ISNUMERIC(p1.Number)=1 AND p1.Number <> 1
于 2012-11-14T09:25:46.507 に答える