2010-08-07 9 views
8

ho segnato una colonna come identità in mia tabellaIdentità SQL con zeri imbottite

create table Identitytest(
    number int identity(1,001) not null, 
    value varchar(500) 
) 

ho bisogno la colonna di identità da incrementare come 001,002,003, ecc

La banca dati indica che esso è l'inserimento come 1,2,3, ecc.

Come può essere fatto?

+1

Perché questo è stato abbassato? La domanda era chiara e comprensibile. – kbrimington

+0

@ David-Stratton: Ah ah! – kbrimington

+2

So che probabilmente non ti interessa, ma mi scuso per i miei commenti precedenti e li sto eliminando (tranne il primo prima che mi sentissi frustrato). Ero fuori linea e mi dispiace. – David

risposta

6

Se si desidera visualizzare la colonna number con gli zeri iniziali, è sufficiente inserirla nell'istruzione SELECT. È un numero, NON memorizzerà con gli zeri iniziali come un intero.

SELECT RIGHT('00000' + CAST([number] AS varchar(5)) , 3) 
FROM IdentityTest 

il 3 è il numero di caratteri che si desidera totale nel display di uscita.

+1

+1. Suppongo sia stato più utile mostrare come ottenere il display che desidera piuttosto che prenderlo in giro per non capire i numeri. – David

+0

grazie per la risposta, ma ho bisogno di memorizzarlo nel Database nel formato 001 di 1,2 ... – Innova

+1

@Ranjana: perché deve essere immagazzinato? Chi sta consumando ciò che non può trarre vantaggio da un piccolo casting e formattazione? –

2

Perché ne hai bisogno? Come numero intero, 001 è uguale a 1. Se quello che vuoi è quello per la visualizzazione o per altri scopi, crea un'altra colonna e fai il tuo lavoro lì (puoi farlo come parte di un trigger sul tavolo, su insert, che sembra nella riga appena inserita e crea correttamente la voce nella colonna

+3

Esatto. Si tratta di formattare l'output. Questa è la seconda domanda che ho visto negli ultimi due giorni. Per un programmatore non capire che 001 è uguale a 1 è solo spaventoso. L'altro utente voleva memorizzare le date nel tipo di dati DateTime senza i millisecondi, in modo che non si presentassero quando si utilizza .ToString(). Sheesh. – David

+1

+1. Questo è sicuramente un problema di visualizzazione, non un problema di archiviazione. @Ranjana: il cliente dovrebbe essere responsabile per il riempimento. –

+0

Perché dovresti conservare questo? potresti semplicemente creare una vista sul tavolo con la logica per riempire il numero intero come appropriato, quindi fare riferimento alla vista ed essere fatto. – DForck42

15

Mentre gli altri hanno già giustamente sottolineato - zeri un INT non ha leader - tiene solo il valore, tutto qui (e va bene così).

Se avete bisogno di qualche formattazione aggiuntiva, si può sempre aggiungere una colonna calcolata al vostro tavolo, qualcosa di simile:

ALTER TABLE dbo.Identitytest 
    ADD DisplayNumber AS RIGHT('000' + CAST(number AS VARCHAR(3)) , 3) PERSISTED 

In questo modo, la vostra identità INT verrà utilizzato come un int e contiene sempre il valore numerico , mentre DisplayNumber contiene 001, 002, ... 014, 015, ..... e così via - automagicamente, sempre aggiornato.

Dal momento che è un campo persistente, è ora parte della vostra tavola, e si può interrogare su di esso, e anche mettere un indice su di esso per rendere le query più veloce:

SELECT value FROM dbo.IdentityTest WHERE DisplayNumber = '024' 

E, naturalmente, è possibile utilizzare quasi ogni formattazione nella definizione della vostra colonna calcolata, così si potrebbe anche aggiungere un prefisso o qualcosa:

ALTER TABLE dbo.Identitytest 
    ADD DisplayNumber 
     AS 'ABC-' + RIGHT('000' + CAST(number AS VARCHAR(3)) , 3) PERSISTED 

quindi, in questo caso, la DisplayNumber sarebbe ABC-001, ABC-002, ... e così via.

Ottenete il meglio da entrambi i mondi: mantenete la vostra INT IDENTITÀ che è numerica e aumentata automaticamente da SQL Server, ed è possibile definire un formato di visualizzazione come più vi piace e renderlo disponibile in qualsiasi momento.

0

ho bisogno della colonna di identità da incrementato come 001.002.003, ecc

La banca dati indica che è inserendo come 1,2,3, ecc

database SQL negozio valori, non i letterali che hai usato per scrivere quei valori. 002è 2. Proprio come 1 + 1è 2. Vi aspettereste SELECT 1 + 1 per visualizzare la stringa "1 + 1" al posto di 2?

Se si desidera memorizzare gli zeri iniziali nella colonna, è necessario utilizzare un tipo di carattere. Ma non è possibile utilizzare AUTOINCREMENT/IDENTITY.

Quello che probabilmente davvero vuole è qualcosa come printf("%03d", number) nel programma che legge dal database.

1

ho un tavolo dove sto memorizzazione di un intero, ma gli utenti vogliono vedere un XXX, anche se non ha zeri, così ho scritto questo codice

declare @a int 
set @a=1 


select replicate('0',3-len(@a))+ cast(@a as varchar(4)) 
1

Qui è un altro metodo :

create table TEST_T (ui int NOT NULL identity, name varchar(10)) 
insert into TEST_T values ('FRED') 
select NAME, ui, RIGHT('0000' + LTRIM(STR(ui)), 4) as ui_T from TEST_T 
go 
/* NOTE: A view could be created with a calculated column instead of the identity column. */ 
create view TEST_V as select NAME, RIGHT('0000' + LTRIM(STR(ui)), 4) as ui_V from TEST_T go 
go 
select * from TEST_V 
drop view TEST_V 
drop table TEST_T 

Non abbastanza tanto la duplicazione dei dati, come l'aggiunta di una colonna alla tabella e non c'è bisogno di specificare la colonna nell'istruzione sELECT (?).