Pergunta

Estou coletando metadados usando os sys. * Pontos de vista, e de acordo com a documentação, os sys.identity_columns ver devolverá os valores de propagação e incremento assim.

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

No entanto, a consulta acima retorna apenas uma coluna. É apenas mim?

(Nota:. Eu tive que mudar esta questão um pouco de sua versão anterior)

Foi útil?

Solução

Você não deveria reverter a partir e se juntar, como este:

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

Outras dicas

Está faltando a cláusula WHERE. Sua consulta é efetivamente dizendo 'Dê-me todo de sys.columns e quaisquer linhas correspondentes de sys.identity_columns você tem (mas dá-me nulo se não houver registros coincidentes)'.

Ao adicionar a cláusula Where abaixo você alterá-lo para única declaração, quando uma correspondência exata é devolvido, o que é o mesmo que uma junção interna neste caso realmente.

SELECIONAR c.name, i.seed_value, i.increment_value DE sys.columns c LEFT OUTER JOIN sys.identity_columns i EM i.object_id = c.object_id E i.column_id = c.column_id Onde I.seed_value não é nulo

Então eu acho que seus dados estão corretos, não há resultados a vista embora.

Tem certeza de que está executando isso em um banco de dados com tabelas com colunas 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

Retorna linhas para me em um banco de dados produção regular com algumas identidades.

Usando um LEFT JOIN retorna essas linhas, bem como muitas que não são IDENTITY

Eu corri isso em outro banco de dados, e eu notei algumas NULLs são devolvidos (mesmo no caso INNER JOIN). Isso ocorre porque algumas das colunas estão em VIEWs.

Tente adicionar:

INNER JOIN sys.tables t
ON t.object_id = c.object_id

Para filtrar apenas para colunas IDENTITY reais em tabelas.

seus retornos de consulta que eu esperaria [ver abaixo]; ele retorna a linha de meta-dados única sobre a coluna única identidade (test_id) na mesa (ident_test), a coluna oter (outro) não tem nenhuma meta-dados na sys.identity_column como é não é uma identidade.

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

O que dá

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top