我正在使用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' )

但是,上面的查询只返回一列。只是我吗?

(注意:我必须从早期版本中稍微改变一下这个问题。)

有帮助吗?

解决方案

你不应该反转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.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不为空

所以我认为你的数据是正确的,但是没有结果可供查看。

您确定在包含 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 列。

你的查询会返回我期望的内容[见下文];它返回有关表(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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top