Sql 将数据类型varchar转换为bigint时出错(带REPLACE)

Sql 将数据类型varchar转换为bigint时出错(带REPLACE),sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,我读过很多类似标题的帖子,但都没有回答我的问题 我有一个包含人口数据列的表。列中的数字以逗号分隔(无可否认,这不是一种最佳做法,但目前我无法控制)。为了对数据进行一些数学运算,我需要删除逗号,但是我得到了标题中提到的错误。下面是前几行数据,后面是应返回数据的查询: POPULATION (No column name) 7,859,000 7859000 575,660 575660 818,000 818000 5,254,000 5254

我读过很多类似标题的帖子,但都没有回答我的问题

我有一个包含人口数据列的表。列中的数字以逗号分隔(无可否认,这不是一种最佳做法,但目前我无法控制)。为了对数据进行一些数学运算,我需要删除逗号,但是我得到了标题中提到的错误。下面是前几行数据,后面是应返回数据的查询:

POPULATION  (No column name)
 7,859,000     7859000
   575,660      575660
   818,000      818000
 5,254,000     5254000
73,751,000    73751000
38,610,000    38610000

SELECT [population],
       CONVERT(bigint,REPLACE(cri.[population],',',''))
FROM Country_Region_Info AS cri
但是,该查询返回上述错误。我能让它工作的唯一方法是用数值(20,0)替换bigint。我不应该那样做。没有任何东西接近bigint的最大值。没有小数。没有前导空格或尾随空格。这是怎么回事


还有一件事我不明白:如果SELECT中包含前5名,则bigint版本的查询将返回结果,但前6名或更多的查询将返回错误。在另一台计算机上,它与前2名一起工作,但在前3名或以上出现错误。

要调查问题,请执行以下操作:

select *
from Country_Region_Info cri
where isnumeric(REPLACE(cri.[population],',','')) = 0 or cri.population like '%.%'
这将找到令人厌恶的数值

要忽略这些值,请执行以下操作:

SELECT [population],
       (case when isnumeric(REPLACE(cri.[population],',','')) = 1 and cri.population not like '%.%'
             then CONVERT(bigint,REPLACE(cri.[population],',',''))
        end)
FROM Country_Region_Info AS cri

您仍然可以使用其他数字格式(“7e6”),但这些格式可能不在您的数据中。

这不会返回任何内容吗<代码>从人口为“[^0-9,]%”的国家/地区信息中选择前5名*不确定这里发生了什么-我无法重现此情况,在我的SQL Server 2008 R2实例中效果很好:-(我几乎可以保证,您在人口列中至少有一行数据不正确。这是您将数字存储为字符串所付出的代价。您说这超出了您的控制范围,但请反击这一可怕的设计决策。选中
SELECT*FROM Country\u Region\u Info as cri,其中ISNUMERIC(CONVERT(bigint,REPLACE(cri.[population],',','')1
如果没有order by,您将无法获得相同的行用于服务器到服务器或查询。我怀疑您不知道有大量的用户。请尝试order by len(population)desc.OK,谢谢Gordon。同样,Peter Radocchia也可以。这些查询返回了两行错误数据(19.082000和10797.000)。我应该知道。同意,Aaron,我将研究使用“powers that be”来更改此选项。+1但您可以在此处添加where子句-目前,您将在第二列中返回NULL行,根据查询的目标,这可能是毫无用处的。:-)