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.)

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top