SQL Serverが疑似列を使用してテーブルの(単一の)ID列の値を返すことができることを学びました$IDENTITY
:
SELECT $IDENTITY FROM Table
この機能は文書化され、信頼できますか?それについての唯一の公式の言及はIDENTITY
ページにありますが、コードサンプルに埋め込まれています。これは、文書化されていないことを意図している可能性があることを示唆しています。この機能についても、Googleによる一致はほとんどありません。
SQL Serverが疑似列を使用してテーブルの(単一の)ID列の値を返すことができることを学びました$IDENTITY
:
SELECT $IDENTITY FROM Table
この機能は文書化され、信頼できますか?それについての唯一の公式の言及はIDENTITY
ページにありますが、コードサンプルに埋め込まれています。これは、文書化されていないことを意図している可能性があることを示唆しています。この機能についても、Googleによる一致はほとんどありません。
回答:
$IDENTITY
(および$ROWGUID
)SELECT句(Transact-SQL)に記載されています。
テーブルにID列がない場合はエラーが発生するため、使用しないように注意してください。次の2つの例を見てください。最初の例は機能しますが(結果タブを確認してください)、2番目の例はエラーをスローします。
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
2つ目は次のようになります。
Msg 207, Level 16, State 1, Line 6
Invalid column name '$IDENTITY'.
ID列を持つ列を探す場合は、代わりにこのスタックオーバーフローの投稿で説明されている方法を使用します。
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];