211

と比較して:

REPLICATE(@padchar, @len - LEN(@str)) + @str
4

20 に答える 20

331

これは、どのように実行しても、SQL の非効率的な使用にすぎません。

おそらく何かのような

right('XXXXXXXXXXXX'+ rtrim(@str), @n)

ここで、X はパディング文字で、@n は結果の文字列の文字数です (固定長を扱っているため、パディングが必要であると仮定します)。

しかし、私が言ったように、データベースでこれを行うことは本当に避けるべきです。

于 2008-09-23T15:50:14.240 に答える
36

何人かがこれのバージョンを提供しました:

right('XXXXXXXXXXXX'+ @str, @n)

nより長い場合、実際のデータが切り捨てられるため、注意してください。

于 2008-09-26T15:06:33.093 に答える
16
@padstr = REPLICATE(@padchar, @len) -- this can be cached, done only once

SELECT RIGHT(@padstr + @str, @len)
于 2008-09-23T15:52:07.793 に答える
9

おそらく、私はこれらのUDFを左右にパディングしています

ALTER   Function [dbo].[fsPadLeft](@var varchar(200),@padChar char(1)='0',@len int)
returns varchar(300)
as
Begin

return replicate(@PadChar,@len-Len(@var))+@var

end

そして右へ

ALTER function [dbo].[fsPadRight](@var varchar(200),@padchar char(1)='0', @len int) returns varchar(201) as
Begin

--select @padChar=' ',@len=200,@var='hello'


return  @var+replicate(@PadChar,@len-Len(@var))
end
于 2010-06-05T22:18:07.903 に答える
8

あなたが提供する方法が本当に非効率的であるかどうかはわかりませんが、長さやパディング文字を柔軟にする必要がない限り、別の方法は次のようになります (「 0" ~ 10 文字:

DECLARE
   @pad_characters VARCHAR(10)

SET @pad_characters = '0000000000'

SELECT RIGHT(@pad_characters + @str, 10)
于 2008-09-23T15:51:27.793 に答える
2

これは左にパディングする簡単な方法です:

REPLACE(STR(FACT_HEAD.FACT_NO, x, 0), ' ', y)

はパッドx番号、yはパッド文字です。

サンプル:

REPLACE(STR(FACT_HEAD.FACT_NO, 3, 0), ' ', 0)
于 2010-12-08T15:45:35.743 に答える
2

vnRocks ソリューションが気に入りました。ここでは udf の形式です

create function PadLeft(
      @String varchar(8000)
     ,@NumChars int
     ,@PadChar char(1) = ' ')
returns varchar(8000)
as
begin
    return stuff(@String, 1, 0, replicate(@PadChar, @NumChars - len(@String)))
end
于 2011-10-28T15:11:45.780 に答える
2

これが誰かに役立つことを願っています。

STUFF ( character_expression , start , length ,character_expression )

select stuff(@str, 1, 0, replicate('0', @n - len(@str)))
于 2011-06-16T13:34:43.850 に答える
2

おそらくやり過ぎかもしれませんが、私はよくこの UDF を使用します。

CREATE FUNCTION [dbo].[f_pad_before](@string VARCHAR(255), @desired_length INTEGER, @pad_character CHAR(1))
RETURNS VARCHAR(255) AS  
BEGIN

-- Prefix the required number of spaces to bulk up the string and then replace the spaces with the desired character
 RETURN ltrim(rtrim(
        CASE
          WHEN LEN(@string) < @desired_length
            THEN REPLACE(SPACE(@desired_length - LEN(@string)), ' ', @pad_character) + @string
          ELSE @string
        END
        ))
END

次のようなことができるようにします。

select dbo.f_pad_before('aaa', 10, '_')
于 2008-09-23T16:01:30.017 に答える
1
select right(replicate(@padchar, @len) + @str, @len)
于 2008-09-23T15:54:41.407 に答える
1

SQL Server 2005 以降では、これを行う CLR 関数を作成できました。

于 2008-09-23T15:55:04.027 に答える
0

これが私の解決策です。任意の文字を埋め込むことができ、高速です。シンプルに行きました。ニーズに合わせて可変サイズを変更できます。

null の場合に何を返すかを処理するパラメータで更新: null の場合、null は null を返します

CREATE OR ALTER FUNCTION code.fnConvert_PadLeft(
    @in_str nvarchar(1024),
    @pad_length int, 
    @pad_char nchar(1) = ' ', 
    @rtn_null NVARCHAR(1024) = '')
RETURNS NVARCHAR(1024)
AS
BEGIN
     DECLARE @rtn  NCHAR(1024) = ' '
     RETURN RIGHT(REPLACE(@rtn,' ',@pad_char)+ISNULL(@in_str,@rtn_null), @pad_length)
END
GO

CREATE OR ALTER FUNCTION code.fnConvert_PadRight(
    @in_str nvarchar(1024), 
    @pad_length int, 
    @pad_char nchar(1) = ' ', 
    @rtn_null NVARCHAR(1024) = '')
RETURNS NVARCHAR(1024)
AS
BEGIN
     DECLARE @rtn  NCHAR(1024) = ' '
     RETURN LEFT(ISNULL(@in_str,@rtn_null)+REPLACE(@rtn,' ',@pad_char), @pad_length)
END
GO 

-- Example
SET STATISTICS time ON 
SELECT code.fnConvert_PadLeft('88',10,'0',''), 
    code.fnConvert_PadLeft(null,10,'0',''), 
    code.fnConvert_PadLeft(null,10,'0',null), 
    code.fnConvert_PadRight('88',10,'0',''), 
    code.fnConvert_PadRight(null,10,'0',''),
    code.fnConvert_PadRight(null,10,'0',NULL)


0000000088  0000000000  NULL    8800000000  0000000000  NULL

于 2020-10-12T15:04:52.213 に答える
-1

小数点以下第2位に四捨五入されているが、必要に応じてゼロが右に埋め込まれている数値を提供するには、次のようにします。

DECLARE @value = 20.1
SET @value = ROUND(@value,2) * 100
PRINT LEFT(CAST(@value AS VARCHAR(20)), LEN(@value)-2) + '.' + RIGHT(CAST(@value AS VARCHAR(20)),2)

誰かがよりきちんとした方法を考えることができるならば、それはありがたいです-上記は不器用に思えます。

:この例では、SQL Serverを使用してレポートをHTML形式で電子メールで送信しているため、データを解析するための追加のツールを使用せずに情報を形式化したいと考えています。

于 2012-03-19T00:52:46.200 に答える
-4

これが私が通常varcharをパディングする方法です

WHILE Len(@String) < 8
BEGIN
    SELECT @String = '0' + @String
END
于 2011-09-21T12:06:54.437 に答える