Самый эффективный способ T-SQL для заполнения varchar слева до определенной длины? - PullRequest
200 голосов
/ 23 сентября 2008

По сравнению с:

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

Ответы [ 18 ]

318 голосов
/ 23 сентября 2008

Это просто неэффективное использование SQL, независимо от того, как вы это делаете.

возможно что-то вроде

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

где X - ваш символ заполнения, а @n - количество символов в результирующей строке (при условии, что вам нужен отступ, потому что вы имеете дело с фиксированной длиной)

Но, как я сказал, вам действительно следует избегать делать это в своей базе данных.

52 голосов
/ 29 сентября 2014

Я знаю, что это было первоначально задано еще в 2008 году, но есть некоторые новые функции, которые были введены в SQL Server 2012. Функция FORMAT значительно упрощает заполнение нулями. Он также выполнит преобразование для вас:

declare @n as int = 2
select FORMAT(@n, 'd10') as padWithZeros

Обновление:

Я сам хотел проверить фактическую эффективность функции FORMAT. Я был очень удивлен, обнаружив, что эффективность была не очень хорошей по сравнению с исходным ответом AlexCuse . Хотя я считаю, что функция FORMAT более чистая, она не очень эффективна с точки зрения времени выполнения. Таблица Tally, которую я использовал, насчитывает 64 000 записей. Слава Мартину Смиту за указание эффективности времени выполнения.

SET STATISTICS TIME ON
select FORMAT(N, 'd10') as padWithZeros from Tally
SET STATISTICS TIME OFF

Время выполнения SQL Server: Время ЦП = 2157 мс, прошедшее время = 2696 мс.

SET STATISTICS TIME ON
select right('0000000000'+ rtrim(cast(N as varchar(5))), 10) from Tally
SET STATISTICS TIME OFF

Время выполнения SQL Server:

процессорное время = 31 мс, прошедшее время = 235 мс.

35 голосов
/ 26 сентября 2008

Несколько человек дали версии этого:

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

будьте осторожны с этим, потому что он урезает ваши фактические данные, если они длиннее, чем n.

16 голосов
/ 23 сентября 2008
@padstr = REPLICATE(@padchar, @len) -- this can be cached, done only once

SELECT RIGHT(@padstr + @str, @len)
9 голосов
/ 06 июня 2010

Возможно, слишком много у меня есть эти 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
6 голосов
/ 23 сентября 2008

Я не уверен, что метод, который вы даете, действительно неэффективен, но альтернативный способ, если он не должен быть гибким по длине или символу заполнения, будет (при условии, что вы хотите дополнить от 0 до 10 символов:

DECLARE
   @pad_characters VARCHAR(10)

SET @pad_characters = '0000000000'

SELECT RIGHT(@pad_characters + @str, 10)
2 голосов
/ 23 сентября 2008

вероятно, перебор, я часто использую этот 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, '_')
2 голосов
/ 08 декабря 2010

это простой способ отступить влево:

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

Где x - номер пэда, а y - символ пэда.

образец:

REPLACE(STR(FACT_HEAD.FACT_NO, 3, 0), ' ', 0)
2 голосов
/ 28 октября 2011

Мне понравилось решение 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
1 голос
/ 23 сентября 2008
select right(replicate(@padchar, @len) + @str, @len)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...