IDENT_CURRENT 返回 NULL

Posted

技术标签:

【中文标题】IDENT_CURRENT 返回 NULL【英文标题】:IDENT_CURRENT returns NULL 【发布时间】:2013-01-12 21:55:20 【问题描述】:

在我的代码中 DR.HasRows() 返回 True,但 DR("LastID") 返回 DBNUllSELECT IDENT_CURRENT ('SiteSection') AS 'LastID' 在 SQL Management Studio 中工作。

__SQLString= "SELECT IDENT_CURRENT ('SiteSection') AS 'LastID'"
Dim DR As SqlDataReader
ddConnect() 'It's my custom class that opens a connection to db, it works
DR = ddExecuteReader()
DR.Read()
If DR.HasRows() Then
    GetLastID = DR("LastID")
End If

【问题讨论】:

你到底为什么关心最高 ID 是多少?你打算如何处理这些信息?我希望您不要在其中添加 1 并假设新值将是下一个插入的值... 【参考方案1】:

我怀疑您的 .NET 应用程序使用的帐户与您用于通过 Management Studio 连接的帐户没有相同的权限。

也就是说,我认为你的方法充其量是有问题的。您打算如何处理来自IDENT_CURRENT() 的信息?如果您认为您可以接受并假设您尚未执行的INSERT 将生成什么IDENTITY 值,请再想一想。有几个因素可以使该假设无效 - 有人可以在此期间重新设定身份,或更改增量,或插入一堆行。

所以我建议你重新考虑你到底需要做什么以及为什么你认为IDENT_CURRENT 是这样做的方法。根据您的评论,您应该发送:

INSERT ... ; SELECT LastID = SCOPE_IDENTITY();

现在您可以确定这是您插入的 ID。

【讨论】:

我不想假设会生成下一个 ID。在 INSERT 之后,我想将页面重定向到刚刚创建的 ID page.asp?ID=blah. @Maysam 然后选择 SCOPE_IDENTITY();插入后立即 我得到的是,如果在一个独立的函数中使用它,它可以工作。【参考方案2】:

来自MSDN:

在 SQL Server 中,用户只能查看安全对象的元数据 用户拥有或已被授予权限的用户。这 表示生成元数据的内置函数,例如 IDENT_CURRENT 如果用户没有任何权限 对象。

你可能会觉得这很有趣:

当 IDENT_CURRENT 值为 NULL 时(因为该表从未 包含行或已被截断),IDENT_CURRENT 函数 返回种子值。

【讨论】:

@Maysam:通过 Mgmt Studio 和程序连接时,您使用的是同一个帐户吗? @Neoilsk 是的,它是同一个帐户。但它们在同一台机器上运行 @Maysam:你能试试SELECT IDENT_CURRENT ('SiteSection')GetLastID = DR(0)吗?【参考方案3】:

检查这个.. Ident_Current returning NULL on SQL 2005

使用 ident_current 或任何其他函数来获取最后一个 身份,用户需要有读取元数据的权限,所以它 需要该数据库上的 db_onwer

【讨论】:

【参考方案4】:

如果由于在使用以下代码之前没有插入任何行而返回 null,则假定种子值为 1:

     SELECT COALESCE((SELECT top(1) IDENT_CURRENT('TableName')),0) +1 as NextId

【讨论】:

以上是关于IDENT_CURRENT 返回 NULL的主要内容,如果未能解决你的问题,请参考以下文章

ident_current 显示错误的最后插入 id

SQLServer数据库DBCC CHECKIDENT命令介绍

SQLServer数据库DBCC CHECKIDENT命令介绍

SQLServer数据库DBCC CHECKIDENT命令介绍

sql 2008里面的select @@indentity怎么用? 语法是啥?

为啥使用 postgresql odbc 驱动程序调用 IDENT_CURRENT 访问 2010?