2010-08-07 11 views
8

He marcado como una columna de identidad en mi mesaIdentidad SQL con ceros principales acolchados

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

necesito la columna de identidad se incremente como 001,002,003, etc.

La base de datos muestra que se está insertando como 1,2,3, etc.

¿Cómo se puede hacer esto?

+1

¿Por qué esto se rechazó? La pregunta era clara y responsable. – kbrimington

+0

@ David-Stratton: ¡Ja, ja! – kbrimington

+2

Sé que probablemente no le importe, pero me disculpo por mis comentarios anteriores y los estoy eliminando (excepto el primero antes de que me sintiera frustrado). Estaba fuera de línea, y lo siento. – David

Respuesta

6

Si desea mostrar su columna number con ceros a la izquierda, justo almohadilla en su estado de cuenta SELECT. es un número, no va a almacenar con ceros a la izquierda como un entero.

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

el 3 es el número de caracteres que desea total en la pantalla de salida.

+1

+1. Supongo que fue más útil mostrar cómo obtener la pantalla que quiere que molestarlo por no entender los números. – David

+0

gracias por responder, pero necesito almacenarlo en la base de datos en el formato 001 insted de 1,2 ... – Innova

+1

@Ranjana: ¿por qué necesita ser almacenado? ¿Quién está consumiendo esto que no puede aprovechar un poco de casting y formato? –

2

¿Por qué lo necesitas? Como un entero, 001 es lo mismo que 1. Si lo que desea es una pantalla u otros fines, cree otra columna y haga su trabajo allí (puede hacerlo como parte de un desencadenador en la tabla, en la inserción, que se ve en la fila recién insertada, y crea la entrada en la columna apropiada.

+3

Correcto ... Se trata de formatear la salida. Esta es la segunda pregunta que he visto en los últimos dos días. Para un programador no entender que 001 es lo mismo que 1 es simplemente aterrador. El otro tipo quería almacenar las fechas en el tipo de datos DateTime sin los milisegundos para que no aparezcan cuando se usa .ToString(). Sheesh. – David

+1

+1. Esto es definitivamente un problema de visualización, no un problema de almacenamiento. @Ranjana: el cliente debe ser responsable del relleno. –

+0

¿Por qué almacenar esto? podría simplemente crear una vista en la tabla con la lógica para rellenar el número entero según corresponda, luego hacer referencia a la vista y terminar. – DForck42

15

Como los otros han ya por derecho señalado - ceros un INT nunca ha principales - solo tiene el valor, eso es todo (y eso es bueno de esa manera).

Si necesita un nuevo formato, siempre se puede añadir una columna computada a su mesa, algo así como:

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

De esta manera, su identidad INT será utilizado como un INT y siempre contiene el valor numérico , mientras que DisplayNumber contiene 001, 002, ... 014, 015, ..... y así sucesivamente - automágicamente, siempre actualizado.

Ya que es un campo PERSISTED, es ahora parte de su mesa, y se puede consultar en él, e incluso poner un índice en él para hacer las consultas más rápidamente:

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

Y, por supuesto, se puede usar casi cualquier formato en la definición de la columna calculada, por lo que también podría añadir un prefijo o algo:

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

así que en este caso, su DisplayNumber habría ABC-001, ABC-002, ... y así sucesivamente.

Obtienes lo mejor de ambos mundos: mantienes tu INT IDENTIDAD que es numérica y aumenta automáticamente mediante SQL Server, y puedes definir un formato de visualización como quieras y tenerlo disponible en cualquier momento.

0

necesito la columna de identidad que se incrementa como 001002003, etc.

La base de datos muestra que es inserción como 1,2,3, etc. tienda

bases de datos SQL valores, no los literales que utilizó para escribir esos valores. 002es 2. Al igual que 1 + 1es 2. ¿Esperaría SELECT 1 + 1 para mostrar la cadena "1 + 1" en lugar de 2?

Si desea que los ceros a la izquierda se almacenen en su columna, debe usar un tipo de carácter. Pero luego no puede usar AUTOINCREMENT/IDENTITY.

Lo que probablemente realmente quiere es algo así como printf("%03d", number) en el programa que lee de la base de datos.

1

que tengo una tabla en la que estoy almacenar un entero, pero los usuarios quieren ver un XXX, incluso si no tiene ceros, así que escribí este código

declare @a int 
set @a=1 


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

Aquí es otro método :

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 

no tanto la duplicación de datos como agregar una columna a la tabla y no hay necesidad de especificar la columna en la instrucción de selección (?).

Cuestiones relacionadas