Onde estão seed_value e increment_value para colunas de identidade?
-
03-07-2019 - |
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)
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 NULL
s são devolvidos (mesmo no caso INNER JOIN
). Isso ocorre porque algumas das colunas estão em VIEW
s.
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)