¿Dónde están seed_value y increment_value para las columnas IDENTITY?
-
03-07-2019 - |
Pregunta
Estoy recolectando metadatos usando las vistas sys. *, y de acuerdo con la documentación, la vista sys.identity_columns devolverá los valores de inicialización e incremento como tal.
CREATE TABLE ident_test (
test_id int IDENTITY(1000,10),
other int
)
SELECT name, seed_value, increment_value
FROM sys.identity_columns
WHERE object_id = OBJECT_ID( 'ident_test' )
Sin embargo, la consulta anterior solo devuelve una columna. ¿Soy yo?
(Nota: He tenido que cambiar esta pregunta un poco de su versión anterior.)
Solución
¿No deberías revertir el from y unirte de esta manera?
SELECT c.name, i.seed_value, i.increment_value
from sys.identity_columns i
join sys.columns c
ON i.object_id = c.object_id
AND i.column_id = c.column_id
Otros consejos
Te falta la cláusula Where. Su consulta dice "Dame todos los sys.columns y las filas coincidentes de sys.identity_columns que tengas (pero dame nulo si no hay filas coincidentes)".
Al agregar la cláusula Where a continuación, la cambiarás para que solo devuelva donde se devuelve una coincidencia exacta, que es lo mismo que una unión interna en esta instancia realmente.
SELECCIONAR c.name, i.seed_value, i.increment_value DESDE sys.columns c IZQUIERDA COMUNICACIÓN EXTERNA sys.identity_columns i ON i.object_id = c.object_id AND i.column_id = c.column_id Donde I.seed_value no es nulo
Así que creo que sus datos son correctos, aunque no hay resultados para ver.
¿Está seguro de que está ejecutando esto en una base de datos con tablas con las columnas IDENTITY
?
SELECT c.name, i.seed_value, i.increment_value
FROM sys.columns c
INNER JOIN sys.identity_columns i
ON i.object_id = c.object_id
AND i.column_id = c.column_id
Devuelve filas para mí en una base de datos de producción regular con algunas identidades.
El uso de un LEFT JOIN
devuelve estas filas, así como muchas otras que no son IDENTITY
Ejecuté esto en otra base de datos, y noté que se devolvieron algunos NULL
(incluso en el caso de INNER JOIN
). Esto se debe a que algunas de las columnas están en VIEW
s.
Intenta agregar:
INNER JOIN sys.tables t
ON t.object_id = c.object_id
Para filtrar solo las columnas IDENTITY
en las tablas.
su consulta devuelve lo que esperaría [ver más abajo]; devuelve la fila de metadatos única sobre la columna de identidad única (test_ID) en la tabla (ident_test), la columna oter (otra) no tiene metadatos en sys.identity_column ya que no es una identidad.
SELECT name, seed_value, increment_value FROM sys.identity_columns WHERE object_id = OBJECT_ID( 'ident_test' ) select name, is_identity, is_nullable from sys.columns WHERE object_id = OBJECT_ID( 'ident_test' )
Lo que da
name seed_value increment_value ----------------------------------------- test_id 1000 10 (1 row(s) affected) name is_identity is_nullable ------------------------------------- test_id 1 0 other 0 1 (2 row(s) affected)