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

尝试将您的 where 子句更改为:

  WHERE ISNUMERIC(p1.Number)=1 AND p1.Number <> 1
于 2012-11-14T09:25:46.507 回答
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

问题是转换正在优化以在您不希望它运行时运行。看看这个

于 2012-11-13T18:25:39.817 回答