O $ IDENTITY está documentado e confiável no SQL Server?

8

Aprendi que o SQL Server pode retornar o valor da coluna de identidade (única) de uma tabela usando a pseudo-coluna $IDENTITY:

SELECT $IDENTITY FROM Table

Esse recurso está documentado e confiável? A única menção oficial está na IDENTITYpágina, mas está enterrada em um exemplo de código. Isso sugere que ele pode ter a intenção de ser indocumentado. Existem também poucas correspondências no Google para esse recurso.

boot4life
fonte

Respostas:

12

$IDENTITY(e $ROWGUID) estão documentados na cláusula SELECT (Transact-SQL) .

Eu recomendaria não usá-lo porque ele lançará um erro quando uma tabela não tiver uma coluna de identidade. Veja estes dois exemplos - o primeiro funciona (verifique a guia Resultados), mas o segundo gera um erro:

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

Aqui está o que o segundo produz:

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

Se você procura descobrir quais colunas têm um campo de identidade, em vez disso, usaria o método descrito nesta postagem do 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, usando as visualizações 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
fonte