IDENT_CURRENT 返回 NULL
Posted
技术标签:
【中文标题】IDENT_CURRENT 返回 NULL【英文标题】:IDENT_CURRENT returns NULL 【发布时间】:2013-01-12 21:55:20 【问题描述】:在我的代码中 DR.HasRows()
返回 True
,但 DR("LastID")
返回 DBNUll
而 SELECT 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的主要内容,如果未能解决你的问题,请参考以下文章
SQLServer数据库DBCC CHECKIDENT命令介绍
SQLServer数据库DBCC CHECKIDENT命令介绍
SQLServer数据库DBCC CHECKIDENT命令介绍