今天我想知道为什么这些简单的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时,我收到错误。
答案 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')