【发布时间】:2012-10-16 08:38:28
【问题描述】:
我有一个查询,我必须从 varchar 列中提取一些数字字段。 当我在 select 语句中进行一些替换和子字符串并将其转换为 bigint 时,一切正常,但是当我在 join 中使用相同的转换时,它会引发错误 “将数据类型 varchar 转换为 bigint 时出错”。 这怎么可能?
select CAST(
case when CHARINDEX('/',f.BML,1)>0
then substring(replace(replace(replace(replace(replace(replace(replace(replace(replace(f.BML,'A',''),'B',''),'C',''),'+',''),',',''),'S',''),'H',''),'P',''),'¸','') ,1,CHARINDEX('/',BML,1)-1)
else replace(replace(replace(replace(replace(replace(replace(replace(replace(f.BML,'A',''),'B',''),'C',''),'+',''),',',''),'S',''),'H',''),'P',''),'¸','')
end as bigint)
from TableN n join TableO o on
n.Id=o.Id
join TableF f on
f.OId=o.OId and
substring(cast(n.RJ as varchar(10)),1,3)=substring(CAST(f.MT AS varchar(10)),1,3) and
CAST(
case when CHARINDEX('/',f.BML,1)>0 then substring(replace(replace(replace(replace(replace(replace(replace(replace(replace(f.BML,'A',''),'B',''),'C',''),'+',''),',',''),'S',''),'H',''),'P',''),'¸','') ,1,CHARINDEX('/',f.BML,1)-1)
else replace(replace(replace(replace(replace(replace(replace(replace(replace(f.BML,'A',''),'B',''),'C',''),'+',''),',',''),'S',''),'H',''),'P',''),'¸','')
end as bigint) =n.mbr
order by n.Ident
【问题讨论】:
-
我猜您的
varchar列中有无法转换为bigint的值。 -
@Mikael Eriksson 但是相同的演员如何在 select 语句中传递?它应该抛出相同的异常。
-
您是否有一个 where 子句过滤掉导致错误的行?
-
连接可能会查看表中的所有行。在字段列表中使用时,转换可能仅应用于实际返回的行。
-
我们看不到您的查询 - 但请注意,在 SQL 中检查条件的顺序几乎没有保证(如果有的话) - 因此,如果您有类似
WHERE Column LIKE '[0-9]' and CONVERT(bigint,Column) = 5的条件,它可能会阻碍转换。
标签: sql-server-2008 casting varchar