$ IDENTITY est-il documenté et fiable dans SQL Server?

8

J'ai appris que SQL Server peut renvoyer la valeur de la colonne d'identité (unique) d'une table en utilisant la pseudo-colonne $IDENTITY:

SELECT $IDENTITY FROM Table

Cette fonctionnalité est-elle documentée et fiable? La seule mention officielle est sur la IDENTITYpage mais elle est enterrée dans un exemple de code. Cela suggère qu'il pourrait être destiné à être sans papiers. Il existe également très peu de correspondances Google pour cette fonctionnalité.

boot4life
la source

Réponses:

12

$IDENTITY(et $ROWGUID) sont documentés dans la clause SELECT (Transact-SQL) .

Je vous déconseille de l'utiliser, car cela générera une erreur lorsqu'une table n'a pas de colonne d'identité. Prenez ces deux exemples - le premier fonctionne (vérifiez votre onglet Résultats), mais le second renvoie une erreur:

CREATE TABLE #EmployeesWithIdentity (EmployeeID INT IDENTITY(1,1), EmployeeName VARCHAR(50));
SELECT $IDENTITY FROM #EmployeesWithIdentity;
GO

CREATE TABLE #Employees (EmployeeName VARCHAR(50));
SELECT $IDENTITY FROM #Employees;
GO

Voici ce que le second produit:

Msg 207, Level 16, State 1, Line 6
Invalid column name '$IDENTITY'.

Si vous cherchez à trouver quelles colonnes ont un champ d'identité, j'utiliserais plutôt la méthode décrite dans ce post Stack Overflow :

select COLUMN_NAME, TABLE_NAME
from INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = 'dbo'
and COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
order by TABLE_NAME

Ou, en utilisant les vues de catalogue:

SELECT s.name,t.name,c.name
FROM sys.schemas AS s 
JOIN sys.tables AS t ON s.[schema_id] = t.[schema_id]
JOIN sys.identity_columns AS c ON t.[object_id] = c.[object_id];
Brent Ozar
la source