【问题标题】:Where are seed_value and increment_value for IDENTITY columns?IDENTITY 列的种子值和增量值在哪里?
【发布时间】:2008-10-20 20:40:26
【问题描述】:

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

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

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

【问题讨论】:

  • 请给我们一个示例数据库,每个相关表中有 2-3 行。
  • 感谢您的提示...如您所见,当我注意到根本没有返回这些字段时,我不得不更改问题。不管样本表有没有行,结果都是一样的。
  • 现在你已经编辑了你的问题,我的回答没有任何意义。 :D 很高兴你找到了答案。

标签: sql-server-2005 metadata system-views


【解决方案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

【讨论】:

  • 否,因为这只会返回标识列。我想要所有的列,并且只有那些可用的扩展属性。
  • 好吧,当我运行您的原始查询时,它工作正常。我以为您想从输出中消除所有非身份列。
  • 我说“工作正常”,因为当我在我的小型数据库上运行您的查询时,它会返回 400 多行,包括我的身份字段。数据按预期返回,非标识列时为空,为时填写。你在找什么?请举例。
  • 我想这就是我想知道的。它应该像你描述的那样工作。 (我最初省略了一个表过滤器来简化示例。)所以我认为我的 SQL Server 副本有问题。
  • 听起来像我。如果您有“从...中选择 col1、col2、col3”,则最好返回 3 列!
【解决方案2】:

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

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

选择 c.name、i.seed_value、i.increment_value 从 sys.columns c 左外连接 sys.identity_columns i ON i.object_id = c.object_id AND i.column_id = c.column_id 其中 I.seed_value 不为空

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

【讨论】:

    【解决方案3】:

    您确定要在包含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 的行

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

    尝试添加:

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

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

    【讨论】:

      【解决方案4】:

      您的查询返回我所期望的 [见下文];它返回关于表 (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 行受影响)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-25
        • 1970-01-01
        • 1970-01-01
        • 2017-07-20
        • 2012-04-14
        • 1970-01-01
        • 1970-01-01
        • 2020-08-04
        相关资源
        最近更新 更多