I'm running some administrative queries and compiling results from sp_spaceused in SQL Server 2008 to look at data/index space ratios of some tables in my database. Of course I am getting all sorts of large numbers in the results and my eyes are starting to gloss over. It would be really convenient if I could format all those numbers with commas (987654321 becomes 987,654,321). Funny that in all the many years I've used SQL Server, this issue has never come up since most of the time I would be doing formatting at the presentation layer, but in this case the T-SQL result in SSMS is the presentation.

我考虑过只创建一个简单的CLR UDF来解决这个问题,但似乎这应该可以在普通的旧T-SQL中完成。所以,我将在这里提出一个问题-如何在香草T-SQL中进行数字格式化?


当前回答

对于2012年以前不包含FORMAT函数的SQL Server,创建如下函数:

CREATE FUNCTION FormatCurrency(@value numeric(30,2))
    RETURNS varchar(50)
    AS
    BEGIN
        DECLARE @NumAsChar VARCHAR(50)
        SET @NumAsChar = '$' + CONVERT(varchar(50), CAST(@Value AS money),1)
        RETURN @NumAsChar
    END 

选择dbo.FormatCurrency (12345678) 返回12345678美元

如果你只想要逗号,就去掉$。

其他回答

虽然我同意包括OP在内的所有人的观点,即格式化应该在表示层完成,但这种格式化可以在T-SQL中通过转换为money然后转换为varchar来完成。不过,这确实包括后面的小数,可以用SUBSTRING循环。

SELECT CONVERT(varchar, CAST(987654321 AS money), 1)

我建议用Replace代替Substring来避免字符串长度问题:

REPLACE(CONVERT(varchar(20), (CAST(SUM(table.value) AS money)), 1), '.00', '')

在SQL Server 2012及更高版本中,这将用逗号格式化一个数字:

select format([Number], 'N0')

您还可以将0更改为您想要的小数点后数位。

这属于Phil Hunt的回答的评论,但是,唉,我没有代表。

剥去”。在数字字符串的末尾加上00",parsename就非常方便了。 它标记以句点分隔的字符串并返回指定的元素,从最右边的标记作为元素1开始。

SELECT PARSENAME(CONVERT(varchar, CAST(987654321 AS money), 1), 2)

收益率“987654321”

对于2012年以前不包含FORMAT函数的SQL Server,创建如下函数:

CREATE FUNCTION FormatCurrency(@value numeric(30,2))
    RETURNS varchar(50)
    AS
    BEGIN
        DECLARE @NumAsChar VARCHAR(50)
        SET @NumAsChar = '$' + CONVERT(varchar(50), CAST(@Value AS money),1)
        RETURN @NumAsChar
    END 

选择dbo.FormatCurrency (12345678) 返回12345678美元

如果你只想要逗号,就去掉$。