在TSQL中对数值进行右对齐的最佳实践

在TSQL中对数字进行右对齐的最佳实践是什么?

我必须格式化固定长度的提取文件,并且需要将数字字段右对齐. (我使用的是SQL Server 2005)

我找到了this,这看起来非常简单.

right('            '+convert(varchar(20),a.num),12)

这是完整的Select语句

select
    a.num,
    fixed_number =
        right('            '+convert(varchar(20),a.num),12)
from
    (
    --Test Data
    select num = 2400.00    union all
    select num = 385.00 union all
    select num = 123454.34
    ) a

Results:

num        fixed_number 
---------- ------------ 
2400.00         2400.00
385.00           385.00
123454.34     123454.34

(3 row(s) affected)

我问这个问题,因为我发现这行代码在工作,看起来INSANELY复杂(它也删除小数和零填充)

CAST(REPLACE(REPLICATE('0', 12 - LEN(REPLACE(CAST(CONVERT(DECIMAL(10,2),@DD8DBAMT) AS VARCHAR),'.',''))) 
+ CAST(CONVERT(DECIMAL(10,2),@DD8DBAMT) AS VARCHAR),'.','') AS VARCHAR(12))

更新:

Daniel Pratt使用函数的想法让我看了SQL#(我们拥有).它有一个名为PadLeft的函数,令人惊讶的是它具有与Daniel Pratt在下面的答案中定义的fn_PadRight函数相同的参数和功能.

以下是如何使用SQL#函数:

DECLARE @F6D2 AS DECIMAL(8,2)
SET @F6D2 = 0
SQL#.String_PadLeft(@F6D2,9,' ')
SQL#.String_PadLeft(123.400,9,' ')
SQL#.String_PadLeft('abc',9,' ')

它可以同时包含数字和字符串.

最佳答案 我唯一可以建议帮助解决“疯狂的复杂性”是将其封装在一个或多个函数中.这是我们正在使用的某种修改版本:

CREATE FUNCTION [dbo].[fn_PadRight]
(
    @Value nvarchar(4000)
    ,@NewLength int
    ,@PadChar nchar(1) = ' '
) RETURNS nvarchar(4000)
AS
BEGIN
    DECLARE @ValueLength int
    SET @ValueLength = LEN(@Value)

    IF (@NewLength > @ValueLength) BEGIN
        SET @Value = @Value + REPLICATE(@PadChar, @NewLength - @ValueLength)
    END

    RETURN @Value
END
GO

CREATE FUNCTION [dbo].[fn_FormatAmountDE]
(
    @Value money
) RETURNS nvarchar(4000)
AS
BEGIN
    RETURN [dbo].[fn_PadRight](REPLACE(CAST(@Value AS varchar), '.', ''), 12, '0')
END
GO
点赞