我正在使用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' )
但是,上面的查询只返回一列。只是我吗?
(注意:我必须从早期版本中稍微改变一下这个问题。)
答案 0 :(得分: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
答案 1 :(得分:0)
您确定在包含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
在具有少量身份的常规生产数据库中为我返回行。
使用LEFT JOIN
会返回这些行以及许多不是IDENTITY
我在另一个数据库上运行它,我注意到返回了一些NULL
(即使在INNER JOIN
情况下)。这是因为有些列位于VIEW
s。
尝试添加:
INNER JOIN sys.tables t
ON t.object_id = c.object_id
仅过滤表格中的实际IDENTITY
列。
答案 2 :(得分:0)
您缺少Where子句。您的查询实际上是在说'给我所有sys.columns以及sys.identity_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不为空
所以我认为你的数据是正确的,但是没有结果可供查看。
答案 3 :(得分:0)
你的查询会返回我期望的内容[见下文];它返回有关表(ident_test)中单个标识列(test_ID)的单个元数据行,其中oter列(其他)在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)