Eu tenho uma cadeia de caracteres com até 3 caracteres quando é criada pela primeira vez no SQL Server 2008 R2.
Gostaria de preenchê-lo com zeros à esquerda, portanto, se seu valor original fosse '1', o novo valor seria '001'. Ou se seu valor original era '23', o novo valor é '023'. Ou, se o valor original for '124', o novo valor será igual ao valor original.
Estou usando o SQL Server 2008 R2. Como eu faria isso usando o T-SQL?
sql-server
tsql
Sunil
fonte
fonte
Respostas:
Se o campo já for uma string, isso funcionará
Se você deseja que os nulos sejam exibidos como '000'
Pode ser um número inteiro - então você deseja
fonte
Embora a pergunta fosse para o SQL Server 2008 R2, no caso de alguém estar lendo isso com a versão 2012 e superior, desde então, ficou muito mais fácil com o uso do FORMAT .
Você pode passar uma sequência de formato numérico padrão ou uma sequência de formato numérico personalizado como argumento de formato (agradeça a Vadim Ovchinnikov por esta dica).
Para esta pergunta, por exemplo, um código como
saídas
fonte
O método seguro:
Isso tem a vantagem de retornar a string
'***'
para n <0 ou n> 999, que é um bom e óbvio indicador de entrada fora dos limites. Os outros métodos listados aqui falharão silenciosamente, truncando a entrada em uma substring de 3 caracteres.fonte
SELECT REPLACE(STR('1',3),' ','0')
Breaks:SELECT REPLACE(STR('1A',3),' ','0')
. Isso me queimou hoje quando um usuário digitou uma letra na string de entrada e eu não testei esse caso.Aqui está uma técnica mais geral para preenchimento à esquerda em qualquer largura desejada:
No entanto, se você estiver lidando com valores negativos e preenchendo com zeros à esquerda, nem isso nem outras técnicas sugeridas funcionarão. Você obterá algo parecido com isto:
[Provavelmente não é o que você queria]
Então ... você terá que passar por alguns obstáculos adicionais. Aqui está uma abordagem que formata corretamente os números negativos:
Deve-se observar que as
convert()
chamadas devem especificar um[n]varchar
comprimento suficiente para reter o resultado convertido com truncamento.fonte
Aqui está uma variante da resposta de Hogan, que eu uso no SQL Server Express 2012:
Em vez de me preocupar se o campo é uma sequência ou não, eu apenas o faço
CONCAT
, pois ele produzirá uma sequência de qualquer maneira. Além disso, se o campo puder ser aNULL
,ISNULL
pode ser necessário usar para evitar que a função obtenhaNULL
resultados.fonte
Sempre achei o método a seguir muito útil.
fonte
Use esta função que se adapte a todas as situações.
Saída de amostra
fonte
DECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 12 - LEN(@NumStr)) + @NumStr;
que retorna o primeiro exemplo de Salar acima. Obrigado Salar.DECLARE @NumStr VARCHAR(250) = '2016'; SELECT REPLICATE('0', 10 - LEN(@NumStr)) + @NumStr;
que retorna0000002016
no primeiro exemplo acima.Para aqueles que desejam atualizar seus dados existentes, aqui está a consulta:
fonte
Para números inteiros, você pode usar a conversão implícita de int para varchar:
fonte
Eu conheço o seu bilhete antigo, só pensei em compartilhá-lo.
Encontrei este código procurando uma solução. Não tenho certeza se funciona em todas as versões do MSSQL, tenho o MSSQL 2016.
retorna "0023" O 4 na função STR é o comprimento total, incluindo o valor. Os exemplos 4, 23 e 123 terão 4 em STR e a quantidade correta de zeros será adicionada. Você pode aumentar ou diminuir. Não há necessidade de obter o comprimento no 23.
Editar: vejo o mesmo que a publicação @Anon.
fonte
Tente isso com comprimento fixo.
fonte
Eu tive um problema semelhante com a coluna inteira como entrada quando eu precisava de saída varchar de tamanho fixo (ou string). Por exemplo, 1 a '01', 12 a '12'. Este código funciona:
Se a entrada também for uma coluna de varchar, você poderá evitar a peça de vazamento.
fonte
Para uma abordagem mais dinâmica, tente isso.
fonte
Escrevi isso porque eu tinha requisitos para um comprimento específico (9). Almofada à esquerda com o @pattern SOMENTE quando a entrada precisar de preenchimento. Sempre deve retornar o comprimento definido em @pattern.
Retorna 1234input
fonte
Simples é isso
Gostar:
fonte
Eu vim aqui especificamente para descobrir como poderia converter meu fuso horário para uma string de fuso horário para converter datas em DATETIMEOFFSET no SQL Server 2008. Bruto, mas necessário.
Então, eu preciso de um método que lide com números negativos e positivos, formatando-os para dois caracteres com um zero à esquerda, se necessário. A resposta de Anons me aproximou, mas os valores negativos do fuso horário apareceriam mais
0-5
do que os necessários-05
Então, com um pouco de ajuste em sua resposta, isso funciona para todas as conversões de fuso horário
fonte
Eu criei essa função que atende bigint e um zero inicial ou outro caractere único (máximo de 20 caracteres retornados) e permite resultados menores que o número de entrada:
fonte