使用千位分隔符错误将Varchar转换为十进制

时间:2013-07-30 08:28:10

标签: c# sql-server casting

今天我想知道为什么这些简单的sql语句返回错误而不是成功执行:

GO
SELECT CAST('1,234.00' AS DECIMAL(22,2))
GO
SELECT CONVERT(DECIMAL(22,2), '1,234.00')

如果删除千位分隔符,我会发现脚本已成功执行。

GO
SELECT CAST('1234.00' AS DECIMAL(22,2))
GO
SELECT CONVERT(DECIMAL(22,2), '1234.00')

所以问题是为什么sql server不接受千位分隔符作为输入?

此外,在主题之外,我发现在C#中成功执行了相同的逻辑。

static void Main(string[] args)
{
    string s = "1,234.00";
    Console.WriteLine(decimal.Parse(s)); // result 1234.00
}

为什么他们有不同的投射对象政策?我在C#验证了字符串,验证效果很好。但是,当我将字符串加载到sql server时,我收到错误。

3 个答案:

答案 0 :(得分:3)

尝试通过金钱转换。

declare @d decimal(10,2)
SELECT @d = CAST('1,234.00' AS money)
select @d
GO
SELECT CONVERT(money, '1,234.00')

将给出

1234.00
1234.00

类似地

declare @m money = 1234
select CONVERT(varchar(20), @m, 1)

给出

1,234.00

请参阅http://msdn.microsoft.com/en-us/library/aa226054(v=sql.80).aspx

答案 1 :(得分:0)

SQL Server的CONVERT不像.net的Parse那样通用。

  • 如果使用2012之前的SQL Server版本,则可能必须手动删除千位分隔符(使用REPLACE)。

  • 从SQL Server 2012开始,您可以使用PARSE方法,该方法似乎在内部使用.net方法。特别是,在转换为decimal时,它会使用NumberStyles.Number,其中包含AllowThousands。以下语句将返回正确的值:

    SELECT PARSE('1,234.00' AS decimal(22,2) USING 'en-us')
    

答案 2 :(得分:-1)

据我所知,十进制不能使用千位分隔符。最适合您的解决方案是转换为货币,然后转换为小数。

SELECT CONVERT(decimal(22,2), CONVERT(money, '1,234.00'))

或仅为钱而言更简单

SELECT CONVERT(money, '1,234.00')