¿$ IDENTITY está documentado y es confiable en SQL Server?

8

Aprendí que SQL Server puede devolver el valor de la columna de identidad (única) de una tabla usando la pseudocolumna $IDENTITY:

SELECT $IDENTITY FROM Table

¿Es esta característica documentada y confiable? La única mención oficial se encuentra en la IDENTITYpágina, pero está enterrada en una muestra de código. Esto sugiere que podría estar destinado a ser indocumentado. También hay muy pocas coincidencias de Google para esta función.

boot4life
fuente

Respuestas:

12

$IDENTITY(y $ROWGUID) están documentados en la cláusula SELECT (Transact-SQL) .

Advertiría contra su uso porque arrojará un error cuando una tabla no tenga una columna de identidad. Tome estos dos ejemplos: el primero funciona (consulte la pestaña Resultados), pero el segundo arroja un error:

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

Esto es lo que produce el segundo:

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

Si está buscando encontrar qué columnas tienen un campo de identidad, utilizaría el método descrito en esta publicación de 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

O, usando las vistas de catálogo:

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
fuente