Em comparação com dizer:
REPLICATE(@padchar, @len - LEN(@str)) + @str
sql
sql-server
tsql
Cade Roux
fonte
fonte
Respostas:
Este é simplesmente um uso ineficiente do SQL, não importa como você o faça.
talvez algo como
onde X é seu caractere de preenchimento e @n é o número de caracteres na sequência resultante (supondo que você precise do preenchimento porque está lidando com um comprimento fixo).
Mas como eu disse, você realmente deve evitar fazer isso no seu banco de dados.
fonte
RTRIM(@str)
se isso puder conter espaços à direita.Eu sei que isso foi solicitado originalmente em 2008, mas há algumas novas funções que foram introduzidas no SQL Server 2012. A função FORMAT simplifica o preenchimento deixado com zeros. Também realizará a conversão para você:
Atualizar:
Eu queria testar a eficiência real da função FORMAT. Fiquei bastante surpreso ao descobrir que a eficiência não era muito boa em comparação com a resposta original do AlexCuse . Embora eu ache a função FORMAT mais limpa, ela não é muito eficiente em termos de tempo de execução. A tabela Tally que usei tem 64.000 registros. Parabéns a Martin Smith por apontar a eficiência do tempo de execução.
Tempos de execução do SQL Server: tempo de CPU = 2157 ms, tempo decorrido = 2696 ms.
Tempos de execução do SQL Server:
fonte
Várias pessoas deram versões disso:
tenha cuidado com isso, porque truncará seus dados reais se for maior que n.
fonte
fonte
Talvez um extermínio eu tenha essas UDFs para cobrir esquerda e direita
e para a direita
fonte
Não tenho certeza de que o método que você fornece seja realmente ineficiente, mas uma maneira alternativa, desde que não precise ser flexível no tamanho ou no caractere de preenchimento, seria (supondo que você queira preenchê-lo com " 0 "a 10 caracteres:
fonte
provavelmente exagere, costumo usar esse UDF:
Para que você possa fazer coisas como:
fonte
Eu gostei da solução vnRocks, aqui está na forma de um udf
fonte
Esta é uma maneira simples de colocar à esquerda:
Onde
x
está o número do bloco ey
o caractere do bloco.amostra:
fonte
1
se tornam001
.fonte
No SQL Server 2005 e posterior, você pode criar uma função CLR para fazer isso.
fonte
Que tal agora:
3 é o número de
zeros
a ser preenchidofonte
Espero que isso ajude alguém.
fonte
Eu uso este. Permite determinar o comprimento que você deseja que o resultado seja, além de um caractere de preenchimento padrão, se não houver um. É claro que você pode personalizar o tamanho da entrada e da saída para quaisquer valores máximos em que estiver se deparando.
Sua milhagem pode variar. :-)
Joey Morgan
Programador / Analista Principal I
Unidade de Negócios WellPoint Medicaid
fonte
Aqui está minha solução, que evita seqüências de caracteres truncadas e usa o SQL simples. Graças a @AlexCuse , @Kevin e @Sklivvz , cujas soluções são a base deste código.
fonte
Eu sei que isso não está adicionando muito à conversa neste momento, mas estou executando um procedimento de geração de arquivos e está indo incrivelmente lento. Eu tenho usado replicate e vi esse método de apara e achei que eu daria uma chance.
Você pode ver no meu código onde a alternância entre os dois é uma adição à nova variável @padding (e a limitação que agora existe). Eu executei meu procedimento com a função nos dois estados com os mesmos resultados em tempo de execução. Portanto, pelo menos no SQLServer2016, não estou vendo nenhuma diferença de eficiência encontrada por outros.
De qualquer forma, aqui está a minha UDF que escrevi anos atrás, além das mudanças atuais, que são praticamente as mesmas que as de outras, exceto por ter uma opção de parâmetro ESQUERDA / DIREITA e alguma verificação de erro.
fonte
Eu tenho uma função que lpad com x decimais: CREATE FUNCTION [dbo]. [LPAD_DEC] (- Adicione os parâmetros para a função aqui @pad nvarchar (MAX), @ string nvarchar (MAX), @length int, @dec int ) RETORNA nvarchar (max) AS BEGIN - Declare a variável de retorno aqui DECLARE @resp nvarchar (max)
FIM
fonte
Para fornecer valores numéricos arredondados para duas casas decimais, mas preenchidos à direita com zeros, se necessário, tenho:
Se alguém puder pensar de uma maneira mais organizada, isso seria apreciado - o acima parece desajeitado .
Nota : neste caso, estou usando o SQL Server para enviar relatórios por email em formato HTML e, portanto, desejo formatar as informações sem envolver uma ferramenta adicional para analisar os dados.
fonte
Aqui está como eu normalmente preencheria um varchar
fonte