Является ли документ $ IDENTITY документированным и надежным в SQL Server?

8

Я узнал, что SQL Server может возвращать значение (одного) столбца идентификаторов таблицы, используя псевдостолбец $IDENTITY:

SELECT $IDENTITY FROM Table

Является ли эта функция документированной и надежной? Единственное официальное упоминание об этом на IDENTITYстранице, но это скрыто в примере кода. Это говорит о том, что оно может быть недокументированным. Для этой функции также замечательно мало соответствий Google.

boot4life
источник

Ответы:

12

$IDENTITY$ROWGUID) описаны в предложении SELECT (Transact-SQL) .

Я бы предостерег от его использования, потому что он выдаст ошибку, если в таблице нет столбца идентификаторов. Возьмите эти два примера - первый работает (проверьте вкладку «Результаты»), но второй выдает ошибку:

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

Вот что производит второй:

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

Если вы ищете, какие столбцы имеют поле идентификатора, я бы использовал метод, описанный в этом посте переполнения стека :

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

Или, используя виды каталога:

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];
Брент Озар
источник