IDENTITY列のseed_valueおよびincrement_valueはどこにありますか?
-
03-07-2019 - |
質問
sys。*ビューを使用してメタデータを収集していますが、ドキュメントによると、sys.identity_columnsビューはシード値と増分値を返します。
CREATE TABLE ident_test (
test_id int IDENTITY(1000,10),
other int
)
SELECT name, seed_value, increment_value
FROM sys.identity_columns
WHERE object_id = OBJECT_ID( 'ident_test' )
ただし、上記のクエリは1列のみを返します。私だけですか?
(注:この質問は以前のバージョンから多少変更しなければなりませんでした。)
解決
次のようにfromとjoinを逆にすべきではありません:
SELECT c.name, i.seed_value, i.increment_value
from sys.identity_columns i
join sys.columns c
ON i.object_id = c.object_id
AND i.column_id = c.column_id
他のヒント
Where句がありません。クエリは「sys.identity_columnsのすべてのsys.columnsおよび一致する行を提供します(ただし、一致する行がない場合はnullを返します)」と言っています。
以下のWhere句を追加することにより、完全一致が返される場所のみを返すように変更します。これは、このインスタンスの内部結合と実際に同じです。
選択 c.name、i.seed_value、i.increment_value から sys.columns c LEFT OUTER JOIN sys.identity_columns i ON i.object_id = c.object_id AND i.column_id = c.column_id I.seed_valueがnullではない
データは正しいと思いますが、表示する結果はありません。
IDENTITY
列を持つテーブルを含むデータベースでこれを実行しますか?
SELECT c.name, i.seed_value, i.increment_value
FROM sys.columns c
INNER JOIN sys.identity_columns i
ON i.object_id = c.object_id
AND i.column_id = c.column_id
いくつかのIDを持つ通常の運用データベースで行を返します。
LEFT JOIN
を使用すると、これらの行と IDENTITY
これを別のデータベースで実行しましたが、 NULL
が返されることに気付きました( INNER JOIN
の場合でも)。これは、一部の列が VIEW
sにあるためです。
追加を試してください:
INNER JOIN sys.tables t
ON t.object_id = c.object_id
テーブル内の実際の IDENTITY
列のみにフィルターをかけます。
クエリは、私が期待するものを返します[以下を参照]。テーブル(ident_test)の単一のID列(test_ID)に関する単一のメタデータ行を返します。他の列(other)には、sys.identity_columnにメタデータがありません。
SELECT name, seed_value, increment_value FROM sys.identity_columns WHERE object_id = OBJECT_ID( 'ident_test' ) select name, is_identity, is_nullable from sys.columns WHERE object_id = OBJECT_ID( 'ident_test' )
与えるもの
name seed_value increment_value ----------------------------------------- test_id 1000 10 (1 row(s) affected) name is_identity is_nullable ------------------------------------- test_id 1 0 other 0 1 (2 row(s) affected)