Où sont seed_value et increment_value pour les colonnes IDENTITY?
-
03-07-2019 - |
Question
Je collecte les métadonnées à l'aide des vues sys. * et, selon la documentation, la vue sys.identity_columns renverra les valeurs de départ et les valeurs d'incrémentation, comme ceci.
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' )
Cependant, la requête ci-dessus ne renvoie qu'une colonne. Est-ce juste moi?
(Remarque: j'ai dû modifier quelque peu cette question par rapport à sa version précédente.)
La solution
Ne devriez-vous pas inverser le point de départ et rejoindre, comme ceci:
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
Autres conseils
Il vous manque la clause Where. Votre requête indique effectivement "Donnez-moi tous les sys.columns et toutes les lignes correspondantes de sys.identity_columns que vous avez (mais donnez-moi la valeur null s'il n'y a pas de lignes correspondantes)".
En ajoutant la clause Where ci-dessous, vous la changez afin de ne renvoyer que dans laquelle une correspondance exacte est renvoyée, ce qui est identique à une jointure interne dans ce cas.
SELECT c.name, i.seed_value, i.increment_value DE sys.columns c LEFT OUTER JOIN sys.identity_columns i ON i.object_id = c.object_id AND i.column_id = c.column_id Où I.seed_value n'est pas null
Donc, je pense que vos données sont correctes, il n'y a aucun résultat à afficher.
Êtes-vous sûr de l'exécuter dans une base de données avec des tables avec des colonnes 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
Renvoie les lignes pour moi dans une base de données de production standard avec quelques identités.
L'utilisation d'un LEFT JOIN
renvoie ces lignes ainsi que de nombreuses autres qui ne sont pas IDENTITY
Je l'ai exécuté sur une autre base de données et j'ai remarqué que certains NULL
étaient renvoyés (même dans le cas INNER JOIN
). En effet, certaines des colonnes figurent dans les VIEW
s.
Essayez d'ajouter:
INNER JOIN sys.tables t
ON t.object_id = c.object_id
Pour filtrer uniquement les colonnes IDENTITY
réelles des tableaux.
votre requête renvoie ce à quoi je m'attendais [voir ci-dessous]; elle renvoie la ligne de métadonnées unique relative à la colonne d'identité unique (ID_test) dans la table (ident_test), la colonne oter (autre) ne contient pas de métadonnées dans la colonne sys.identity_column car elle n'est pas une identité.
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' )
Ce qui donne
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)