0

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

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

(注意:我不得不从早期版本中改变这个问题。)

4

4 回答 4

1

您不应该像这样反转 from 并加入吗:

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
于 2008-10-20T20:48:50.300 回答
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

在具有几个身份的常规生产数据库中为我返回行。

使用 aLEFT JOIN返回这些行以及许多不是IDENTITY

我在另一个数据库上运行它,我注意到一些NULLs 被返回(即使在这种INNER JOIN情况下)。这是因为有些列在VIEWs 中。

尝试添加:

INNER JOIN sys.tables t
ON t.object_id = c.object_id

仅过滤到表中的实际IDENTITY列。

于 2008-10-20T20:46:44.903 回答
0

您缺少 Where 子句。您的查询实际上是在说“给我所有 sys.columns 以及您拥有的 sys.identity_columns 中的任何匹配行(但如果没有匹配的行,则给我 null)”。

通过在下面添加 Where 子句,您可以将其更改为仅返回返回完全匹配的位置,这实际上与此实例中的内部连接相同。

SELECT c.name, i.seed_value, i.increment_value FROM 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 不为空

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

于 2008-10-20T20:50:56.863 回答
0

您的查询返回我所期望的[见下文];它返回关于表 (ident_test) 中单个标识列 (test_ID) 的单个元数据行,其他列 (other) 在 sys.identity_column 中没有元数据,因为它不是标识。

选择名称、种子值、增量值
  FROM sys.identity_columns
 WHERE object_id = OBJECT_ID('ident_test')

选择名称、is_identity、is_nullable
来自 sys.columns
WHERE object_id = OBJECT_ID('ident_test')

这使

名称种子值增量值
-----------------------------------------
test_id 1000 10
(1 行受影响)

名称 is_identity is_nullable
-------------------------------------
test_id 1 0
其他 0 1

(2 行受影响)
于 2008-10-20T21:40:58.290 回答