Tsql 这是一个足够好的函数,可以在nvarchar的左侧填充0吗?

Tsql 这是一个足够好的函数,可以在nvarchar的左侧填充0吗?,tsql,Tsql,我没有太多的t-sql经验,但我提出了这个函数,在传入的nvarchar参数的左侧填充0。左侧填充的0的数量基于传入参数的原始长度。我将解释每个变量,然后显示我的函数。我对它进行了测试,它确实可以工作,但我很好奇,我是否可以对它进行任何重构或改进 @number是传递到要填充的函数中的数字 @结果是返回的填充数字-数字的数据类型实际上是一个nvarchar,尽管我称它为数字 @maxLength是所有数字必须符合的最大长度。这永远是10 @actualLength是传递给函数的数字的原始长度 @

我没有太多的t-sql经验,但我提出了这个函数,在传入的nvarchar参数的左侧填充0。左侧填充的0的数量基于传入参数的原始长度。我将解释每个变量,然后显示我的函数。我对它进行了测试,它确实可以工作,但我很好奇,我是否可以对它进行任何重构或改进

@number是传递到要填充的函数中的数字

@结果是返回的填充数字-数字的数据类型实际上是一个nvarchar,尽管我称它为数字

@maxLength是所有数字必须符合的最大长度。这永远是10

@actualLength是传递给函数的数字的原始长度

@numOfZerosToPad是@maxLength-@actualLength

作为旁注,我看到人们确实选择@variable=1并设置@variable=1。这有什么不同吗?还是更多的是口味问题

以下是函数:

CREATE FUNCTION f_PadZerosToNumber
(
@number nvarchar(10)
)
RETURNS nvarchar(10)
AS
BEGIN

DECLARE @Result nvarchar(10)

    DECLARE @maxLength int

    SET @maxLength = 10

    DECLARE @actualLength int

    SET @actualLength = LEN(@number)

    DECLARE @numOfZerosToPad int

    SET @numOfZerosToPad = @maxLength - @actualLength

SET @Result = REPLICATE('0',@numOfZerosToPad) + @number

RETURN @Result

END
GO

如果你肯定被限制在十个,而填充总是零

CREATE FUNCTION f_PadZerosToNumber (
    @Number nvarchar(10)
)
RETURNS nvarchar(10)
AS BEGIN
    RETURN RIGHT('0000000000' + @Number, 10)
END
GO

作为一个值的添加,如果您只尝试填充数字,考虑将它们转换成int,然后使用以下内容:

DECLARE @MyNumber INT, 
        @PadCount INT
SELECT  @MyNumber = 123,
        @PadCount = 8
SELECT REPLACE(STR(@MyNumber, @PadCount), ' ', '0')

祝你好运

您可以用以下代码替换方法中的大部分代码

SELECT RIGHT(REPLICATE(@padChar,@size) + @number, @size)
您只需将@padChar设置为“0”,“将@size设置为10”,“将@number设置为正在填充的数字即可


如何操作、硬编码、功能参数等取决于您

是的,数字必须始终为10。在这种情况下,原始数字的长度有关系吗?我本来想单独问这个问题,但我想我会在这里问。对于左右函数,如果数字+0000000000小于10,它将返回原始数字加上左边的0,组成10个字符,对吗?这有点让人困惑,因为您在右边调用函数,但它在左边填充数字。如果将“1111”作为@Number,将其添加到“0000000000”将导致“0000000000 1111”。提取最右边的10个字符将得到“0000001111”,这似乎就是您希望实现的目标。如果你把“1111”改为“22222”并重复我的例子,这应该能回答你接下来的两个问题。谢谢Dylan。看到你的代码后,我的看起来像是一团糟。@Xaisoft:是的,使用LEFT会抓住从左边开始的字符。“通用”的意思是更通用;如果您按照他的指示使用REPLICATE,只需更改作为@length传递的参数,就可以轻松地从最终宽度10更改为不同的最终宽度。如果我需要将这些更新后的数字作为nvarchar存储回nvarchar列,这将是一个额外的步骤,对吗?是的,如果你需要的话,你可以把结果交给NVARCHAR。谢谢你的提示。在我的例子中,使用恰到好处似乎很有效,因为我知道长度必须是10。