$IDENTITY 在 SQL Server 中是否有记录且可靠?

boo*_*ife 8 sql-server identity

我了解到 SQL Server 可以使用伪列返回表的(单个)标识列的值$IDENTITY

SELECT $IDENTITY FROM Table
Run Code Online (Sandbox Code Playgroud)

此功能是否有文档记录且可靠?唯一的官方提及是在IDENTITY页面上,但它隐藏在代码示例中。这表明它可能是未记录的。与此功能匹配的 Google 也非常少。

Bre*_*zar 12

$IDENTITY(和$ROWGUID) 记录在SELECT Clause (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
Run Code Online (Sandbox Code Playgroud)

这是第二个产生的结果:

Msg 207, Level 16, State 1, Line 6
Invalid column name '$IDENTITY'.
Run Code Online (Sandbox Code Playgroud)

如果您要查找哪些列具有标识字段,我将使用此 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
Run Code Online (Sandbox Code Playgroud)

或者,使用目录视图:

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];
Run Code Online (Sandbox Code Playgroud)