2010-07-15 10 views
5

¿Cómo puedo crear una clave principal en SQL Server 2005/2008 con el formato: CurrentYear + auto-increment?Clave primaria basada en el año?

Ejemplo: El año actual es 2010, en una nueva tabla, la ID debe comenzar en 1, entonces: 20101, 20102, 20103, 20104, 20105 ... y así sucesivamente.

+0

Secuencia + Disparador – BenV

+0

¿No puede simplemente establecer la identidad se ed el valor de inicio a 20100? – Kane

+0

@Kane Pero de esta manera después de 20109, ¡sumará hasta 20110! – BrunoSalvino

Respuesta

2

Esto cumple técnicamente las necesidades de lo que solicitó:

CREATE TABLE #test 
     (seeded_column INT IDENTITY(1,1) NOT NULL 
     , year_column INT NOT NULL DEFAULT(YEAR(GETDATE())) 
     , calculated_column AS CONVERT(BIGINT, CONVERT(CHAR(4), year_column, 120) + CONVERT(VARCHAR(MAX), seeded_column)) PERSISTED PRIMARY KEY 
     , test VARCHAR(MAX) NOT NULL); 

INSERT INTO #test (test) 
SELECT 'Badda' 
UNION ALL 
SELECT 'Cadda' 
UNION ALL 
SELECT 'Dadda' 
UNION ALL 
SELECT 'Fadda' 
UNION ALL 
SELECT 'Gadda' 
UNION ALL 
SELECT 'Hadda' 
UNION ALL 
SELECT 'Jadda' 
UNION ALL 
SELECT 'Kadda' 
UNION ALL 
SELECT 'Ladda' 
UNION ALL 
SELECT 'Madda' 
UNION ALL 
SELECT 'Nadda' 
UNION ALL 
SELECT 'Padda'; 

SELECT * 
FROM #test; 

DROP TABLE #test; 
+0

¿Es esta la implementación de la solución propuesta por @Pontus Gagge? – BrunoSalvino

+0

No. @Pontus Gagge sugiere crear un índice compuesto en dos columnas en lugar de una columna calculada derivada de dos columnas. –

+0

No del todo, pero una alternativa interesante si realmente quiere materializar sus claves de AÑO + CONTADOR directamente. Investigaría cuidadosamente si SQL Server es tan eficiente en el manejo de columnas calculadas como claves primarias como con claves compuestas. Mi intuición es que vas a tener un golpe de rendimiento significativo. –

9

El cleaner solution es crear un composite primary key que consta de, p. Ej. Year y Counter columnas.

+1

+1 para mantener los tipos separados, aunque no tengo claro por qué incluir el año es necesario en primer lugar. –

+0

Mi hipótesis es que las claves van a ser visibles para los usuarios finales (como un esquema de numeración de pedidos). De lo contrario, recomendaría una clave puramente sintética. –

3

No estoy seguro exactamente de lo que está tratando de lograr haciendo eso, pero tiene mucho más sentido hacerlo con dos campos.

Si la combinación de los dos debe ser PK por alguna razón, simplemente extiéndala entre ambas columnas. Sin embargo, parece innecesario ya que la parte de identidad será exclusiva exclusiva del año.

0

usted tiene que escribir un disparador para esto :)

tener una tabla separada para almacenar el último dígito utilizado (Realmente no sé si hay algo similar a las secuencias en Oracle en SQL Server).

O

Usted puede conseguir el artículo insertado último elemento y extraer el último número de la misma.

ENTONCES

que pueda obtener el año en curso de SELECT DATEPART(yyyy,GetDate());

El detonante podría ser un disparador ON INSERT donde se combina el año y el último dígito y actualizar la columna

Cuestiones relacionadas