Temos uma tabela SQL antiga que foi usada pelo SQL Server 2000 por quase 10 anos.
Nele, nossos números de crachá de funcionário são armazenados char(6)
de 000001
a 999999
.
Estou escrevendo um aplicativo da web agora e preciso armazenar os números dos crachás dos funcionários.
Na minha nova tabela, eu poderia pegar o atalho e copiar a tabela antiga, mas estou esperando por uma transferência de dados melhor, tamanho menor, etc, simplesmente armazenando os int
valores de 1
a 999999
.
Em C #, posso formatar rapidamente um int
valor para o número do emblema usando
public static string GetBadgeString(int badgeNum) {
return string.Format("{0:000000}", badgeNum);
// alternate
// return string.Format("{0:d6}", badgeNum);
}
Como eu modificaria essa consulta SQL simples para formatar o valor retornado também?
SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0
Se EmployeeID
for 7135, esta consulta deve retornar 007135
.
sql
sql-server
tsql
string-formatting
jp2code
fonte
fonte
0
s iniciais são significativos para este campo, por que alterá-lo para umINT
?FORMAT
função como C # :-)int
valores ocupam muito menos espaço do que issochar(6)
, e haverá várias dessas entradas por peça fabricada. Eficiência.DATALENGTH()
) dois bytes cada. Como a coluna pode estar em um índice, você pode economizar mais de 2 MB. E com outras colunas somadas, esses 2 bytes podem ser apenas o suficiente para reduzir o comprimento de uma linha o suficiente para salvar uma página de 4 KB por linha. Será hospedado em uma plataforma móvel ou você pode estar focando sua atenção em uma área improdutiva?Respostas:
Altere o número 6 para qualquer que seja o seu comprimento total:
Se a coluna for um INT, você pode usar RTRIM para convertê-la implicitamente em um VARCHAR
E o código para remover esses 0s e recuperar o número 'real':
fonte
Basta usar a função FORMAT (funciona no SQL Server 2012 ou mais recente):
Referência: http://msdn.microsoft.com/en-us/library/hh213505.aspx
fonte
Format
não preserva o tipo de dados, mas converte implicitamente em nvarchar:select sql_variant_property(50, 'BaseType'), sql_variant_property(format(50, N'00000'), 'BaseType')
Você pode alterar o seu procedimento desta forma
No entanto, isso assume que seu
EmployeeID
é um valor numérico e este código altera o resultado para uma string, sugiro adicionar novamente o valor numérico originalEDITAR Claro que não li com atenção a pergunta acima. Diz que o campo é um
char(6)
EmployeeID não é um valor numérico. Embora essa resposta ainda tenha um valor per se, não é a resposta correta para a pergunta acima.fonte
'000000'
realmente necessário ..?'0'
também funcionando bem. É seguro usar apenas um 0 ..?07135
não007135
. A ideia toda é concatenar em uma string de 6 caracteres composta de toda0
a string convertida EmployeedID e, em seguida, INICIAR da borda direita pegar 6 caracteres. Qualquer que seja o comprimento do ID, o método acima retorna sempre uma string com apenas o número zero de caracteres necessário para atingir o comprimento de 6 caracteres'00000'
pois oEmployeeID
conterá pelo menos um dígito. Mas aREPLICATE()
função parece mais adequada, como nas outras respostasOdiava ter que CONVERTER o int, e isso parece muito mais simples. Pode até ter um desempenho melhor, pois há apenas uma conversão de string e adição simples.
selecione RIGHT (1000000 + EmployeeId, 6) ...
Apenas certifique-se de que "1000000" tenha pelo menos tantos zeros quanto o tamanho necessário.
fonte
Estou postando tudo em um só lugar, tudo funciona para mim preencher com 4 zero à esquerda :)
fonte
Outra forma, apenas para completar.
Ou, de acordo com sua consulta
fonte
A partir da versão 2012, você pode usar
fonte
Tão limpo quanto possível e com escopo de substituição por variáveis:
fonte
EmployeeID
coluna for definida comoint
, o operador + será tratado como adição em vez de concatenação e, portanto, os zeros serão perdidos. O usoconvert
evitará esse problema.fonte
fonte
7135.0
quando eu dei7135
.A solução funciona para números assinados / negativos com zeros à esquerda, para todas as versões Sql:
fonte
O mais simples é sempre o melhor:
fonte
Na minha versão do SQL, não consigo usar REPLICATE. ENTÃO eu fiz isso:
fonte