Ist $ IDENTITY in SQL Server dokumentiert und zuverlässig?

8

Ich habe gelernt, dass SQL Server den Wert der (einzelnen) Identitätsspalte einer Tabelle mithilfe der Pseudospalte zurückgeben kann $IDENTITY:

SELECT $IDENTITY FROM Table

Ist diese Funktion dokumentiert und zuverlässig? Die einzige offizielle Erwähnung ist auf der IDENTITYSeite, aber sie ist in einem Codebeispiel vergraben. Dies deutet darauf hin, dass es möglicherweise nicht dokumentiert sein soll. Es gibt bemerkenswert wenige Google-Übereinstimmungen für diese Funktion.

boot4life
quelle

Antworten:

12

$IDENTITY(und $ROWGUID) sind in der SELECT-Klausel (Transact-SQL) dokumentiert .

Ich würde davor warnen, es zu verwenden, da es einen Fehler auslöst, wenn eine Tabelle keine Identitätsspalte hat. Nehmen Sie diese beiden Beispiele - das erste funktioniert (überprüfen Sie die Registerkarte Ergebnisse), das zweite gibt jedoch einen Fehler aus:

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

Folgendes produziert der zweite:

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

Wenn Sie herausfinden möchten, welche Spalten ein Identitätsfeld haben, verwende ich stattdessen die in diesem Beitrag zum Stapelüberlauf beschriebene Methode :

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

Oder verwenden Sie die Katalogansichten:

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
quelle