重新格式化这段SQL以避免千位分隔符的最佳方法是什么

时间:2016-05-09 15:42:47

标签: sql sql-server

作为SQL存储过程(生成XML输出)的一部分,我有以下几行:

FORMAT(Quantity * ld.UnitPrice, 'N2') AS '@value'

这已经产生了几个月的完全可接受的结果。然而,上周,由于该值超过一千磅(英镑),此过程生成的XML失败的服务失败,产生以下输出1,049.60

如果服务文档提到了这样一个事实,那就是它在作为属性传递给它的值中不喜欢逗号,但该参数是另一天。

关于重新格式化这一行的最佳方法,我提出了一些建议,以便它不会产生任何分隔成千上万的东西,换句话说,我需要它来生成以下1049.60或类似的东西每当超过一千磅的价值到达时。它仍然需要保留两位小数。

虽然我已经特别提到英镑这种格式需要文化中立,所以所有超过一千的数字都没有分隔符。

3 个答案:

答案 0 :(得分:2)

您可以删除格式化功能。然后,如果需要,添加convert(decimal(9,2), YourColumn)

答案 1 :(得分:1)

您可以使用格式为'F2'的FORMAT功能。 'F'是定点格式说明符。所有数字类型都支持此功能。

DECLARE @quantity int = 65;
DECLARE @unitPrice money = 150.33;

SELECT FORMAT(@quantity * @unitPrice, 'F2') AS 'Amount';

enter image description here

请参阅联机丛书> FORMAT(Transact-SQL):https://msdn.microsoft.com/en-GB/library/hh213505.aspx

MSDN>标准数字格式字符串:https://msdn.microsoft.com/library/dwhawy9k.aspx

但是,如果您将数字格式化为字符串然后传递它们,则需要注意语言和文化设置。小数点分隔符可能会更改为逗号。

您可以通过为FORMAT函数指定文化为“en-US”来确保这始终是一个句号,该函数采用可选的第三个参数。

SET LANGUAGE 'Portuguese';
SELECT FORMAT(@quantity * @unitPrice, 'F2', 'en-US') AS 'Amount';

enter image description here

参见由Alex Kuznetsov用SQL Server进行的防御性数据库编程,由Redgate出版>第1章:基本防御性数据库编程技术> SET LANGUAGE如何破解查询

  

许多开发人员仅在其服务器的默认语言设置下测试其代码,并且如果在具有不同语言设置的服务器上执行,或者如果会话中的设置发生更改,则不测试其代码将如何响应水平。

联机丛书> SQL Server中的本地语言版本:https://msdn.microsoft.com/en-us/library/ee210665.aspx#BK_ConfigureOS

答案 2 :(得分:0)

如果您决定坚持使用format功能,它只想共享一个选项,它也支持其他格式:

FORMAT(Quantity * ld.UnitPrice, '0.00') AS '@value'