Sql server MsSql服务器中的作用域\标识()

Sql server MsSql服务器中的作用域\标识(),sql-server,Sql Server,在插入后执行SELECT SCOPE_IDENTITY()时,我得到一个空值。请注意,在我编写代码时,它就像一个符咒。代码是在经典的ASP 我使用的查询是: INSERT INTO EID_Mandates([Uidx],[NatNr],[FirstName],[LastName],[ValidFrom],[ValidUntil],[Active]) VALUES(24387,'1234567','Paul','Tergeist','09/11/2015','09/11/2018',1); S

在插入后执行SELECT SCOPE_IDENTITY()时,我得到一个空值。请注意,在我编写代码时,它就像一个符咒。代码是在经典的ASP

我使用的查询是:

INSERT INTO EID_Mandates([Uidx],[NatNr],[FirstName],[LastName],[ValidFrom],[ValidUntil],[Active]) 
VALUES(24387,'1234567','Paul','Tergeist','09/11/2015','09/11/2018',1);
SELECT SCOPE_IDENTITY() As MYID
执行时,Insert正常,但没有返回值(rs.fields.Count=0)

Id位于Id_指令字段上(自动递增)

我很困惑


编辑:11月10日至10:56上午

好的,在接受了CPMunich的解决方案之后,我继续寻找问题的原因,因为编程不是魔术。使用逻辑代码时需要逻辑结果

我的发现更令人沮丧

1) 当我测试它时,插入代码工作了,这是肯定的,不,我没有对它做任何更改

2) 我做了一些测试,即使用一个简单的脚本检查Scope_Identity()是否仍在工作。。。对

3) 然后,我稍微修改了我以前的代码,以通过返回(并显示ID)的测试函数。不,只有1个字段,不包含任何内容(NULL)。在这个函数中,我添加了打开另一个连接的代码(与打开主连接的代码相同)。该死,成功了

4) 我记录了这两种情况下生成的SQL。除了datetime和ID,完全相同

所以在这一点上,我知道我的连接有点损坏,但不知道为什么

最后,我必须补充一点,整个服务器在几个月前出现了一个大问题,那就是一个糟糕的MS更新(KB2992611),这使得整个过程非常缓慢(这个错误影响了IIS通过LSASS连接到MSSQL服务器的方式。简言之,服务器的每一个查询速度都慢了10倍

没问题,我目前正在做迁移到另一个的所有工作

结论:不确定,很遗憾。如果我有新发现,我会通知你们的

谢谢你们的帮助,谢谢StackOverflow

备注:当你仔细想一想,毕竟PHP也是相当“古老”的,不是吗?:)

请确保

  • 这两条语句都使用相同的SqlCommand执行
  • 您尚未为该表设置插入触发器

  • 如果您为该表设置了插入触发器,请使用
    范围\u标识

    也许这是您的一个选项:

     INSERT INTO EID_Mandates([Uidx],[NatNr],[FirstName],[LastName],[ValidFrom],[ValidUntil],[Active]) 
     OUTPUT inserted.id_mandate
     VALUES(24387,'1234567','Paul','Tergeist','09/11/2015','09/11/2018',1);
    

    您将返回一个列id为的记录集。如果插入失败,记录集将为空。

    您确定没有人更改列的标识定义吗?返回多少记录集?如果有两条语句,则可能需要移动到下一个记录集。另外,插入成功了吗?您确定没有捕获错误并忽略它吗?您是否已在SSMS中手动尝试过此操作?请确保您没有关闭SqlConnection并在不同的SqlConnection中执行
    SELECT SCOPE_IDENTITY()As MYID
    。仅执行如图所示的语句。仅一次插入,作用域ID select位于同一查询中。请确保没有为该表设置插入触发器
    @@Identity
    有问题,因为它将返回最后一个标识列值,而与作用域或表无关。这可能会产生错误的值。您的解决方案是有效的,但遗憾的是,我不理解为什么Scope_Identity()在这里不起作用,即使它在同一代码中曾经起作用。非常感谢你的宝贵帮助。