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

Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top