SQL 2005、2008 中 SCOPE_IDENTITY() 或 @@IDENTITY 返回错误值

docker安装fastdfs+nginx配置 docker安装fastdfs+nginx,实现图片或文件的上传与下载 阅读详情

在SQL Server 2005中,在调用存储过程插入数据的过程中,有时候返回NULL,但是数据确实是加入了,ID列也产生了,这是为何呢?找到以下内容,说明了问题:


我们在 Microsoft SQL Server 2005、2008 中,使用 SCOPE_IDENTITY() 或 @@IDENTITY 时,可能会返回错误的值(特别是在多核 CPU 上)。

微软已经确认这是一个问题,并且目前无修复包。受影响的 SQL Server 包括:

  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2008 Developer
  • Microsoft SQL Server 2008 Enterprise
  • Microsoft SQL Server 2008 R2 Developer
  • Microsoft SQL Server 2008 R2 Enterprise
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Evaluation Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2008 Standard
  • Microsoft SQL Server 2008 Workgroup
  • Microsoft SQL Server 2008 Web
  • Microsoft SQL Server 2008 Standard Edition for Small Business
  • Microsoft SQL Server 2008 R2 Standard
  • Microsoft SQL Server 2008 R2 Web
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Enterprise X64 Edition

我的解决办法

这是在微软的 Connect 上看到的,原理不详,但我试了它确实有效。

SET NOCOUNT ON SELECT SCOPE_IDENTITY() as  lastIndex

也就是多加一个 SET NOCOUNT ON,ON、OFF 都可以阻止这个 BUG。(加了 SET NOCOUNT ON 并不会导致在 SQL Server 2000 中时出错。)

微软的解决方法

微软的几个解决方法我看得都头大,而且我试了其中一部分,竟然没用,不知道是不是我用错了。

微软建议目前不要使用这两个函数,而使用 OUTPUT 子句代替:

DECLARE @MyNewIdentityValues table(myidvalues int)
declare @A table (ID int primary key)
insert into @A values (1)
declare @B table (ID int primary key identity(1,1), B int not null)
insert into @B values (1)
select
    [RowCount] = @@RowCount,
    [@@IDENTITY] = @@IDENTITY,
    [SCOPE_IDENTITY] = SCOPE_IDENTITY()
 
set statistics profile on
insert into _ddr_T
output inserted.ID into @MyNewIdentityValues 
    select
            b.ID
        from @A a
            left join @B b on b.ID = 1
            left join @B b2 on b2.B = -1
            left join _ddr_T t on t.T = -1
        where not exists (select * from _ddr_T t2 where t2.ID = -1)
set statistics profile off
 
select
    [RowCount] = @@RowCount,
    [@@IDENTITY] = @@IDENTITY,
    [SCOPE_IDENTITY] = SCOPE_IDENTITY(),
    [IDENT_CURRENT] = IDENT_CURRENT('_ddr_T')
select *  from @MyNewIdentityValues 
go

如果你非要使用 SCOPE_IDENTITY() 或 @@IDENTITY,请使用下面的解决方法:

法一、要查询中包含以下语句:

OPTION (MAXDOP 1)

注意:这会损伤 SELECT 性能。

法二、先读 SELECT 部分的值到变量集,再用 MAXDOP=1 插入到目标表,插入就不会并行了,性能就不受影响了。晕。

法三、执行下面的代码,将最大并行数改为 1。

sp_configure 'max degree of parallelism', 1 
go 
reconfigure with override 
go

注意:这个对整个数据库性能操作比较严重,慎用。


Windows 下运行 openclaw 出现“‘openclaw‘ 不是内部或外部命令,也不是可运行的程序或批处理文件“的解决方案 方案适用场景推荐指数检查并手动添加 PATH明确知道全局安装目录,只是没加进PATH⭐⭐⭐⭐⭐pnpm setup 自动配置使用 pnpm 安装,想要省心的自动化方式⭐⭐⭐⭐⭐npx 免安装临时运行快速验证核心程序是否正常,排除法排查⭐⭐⭐⭐清理残留后重装npm/pnpm 混用导致版本混乱⭐⭐⭐⭐改用 WSL2不熟悉 Windows 路径体系,长期使用⭐⭐⭐'openclaw' 不是内部或外部命令这类报错,本质上不是"程序坏了",而是。 阅读详情

相关推荐

mysql 学习笔记(1):mysql 基本概念和 mysql workbench 的基本使用方法

…

qq_52740163的博客 1356

SQLSyntaxErrorException: FUNCTION db_gwxf.SCOPE_IDENTITY does not exist 解决方案

springboot项目,数据库使用mysql,dao层框架使用 jpa, 控制主键自增实体类上加@GeneratedValue(strategy = GenerationType.IDENTITY)这个主键,报错SCOPE_IDENTITY does not exist 解决方案

m0_69057918的博客 449

Unreal从入门到精通之如何绘制用于VR的3DUI交互的手柄射线

之前我写过一篇文章《Unreal5从入门到精通之如何在VR中使用3DUI》,其中讲到使用WidgetComponent和3DUI进行交互。然而,这种方法存在一个问题:为了让射线可视化,我们需要勾选“调试/显示调试”,这样才能在手柄上看到代表其指向的一条红色射线。但最关键的问题是,这个显示调试信息的功能只属于Debug调试模式,也就是说,一旦将项目正式打包发布,这条射线辅助线就没有了。如下图所示:我就觉得Unreal官方真的是有点过分了,这不应该是最基本的功能么?难道我们VR要在Debug模式下发布?

TxNet 1612

java访问sql 2008 检索自动生成的键,获得 IDENTITY 值的方法

<br /> <br />访问sql2008,insert后获得自动生成的键,用sql2000处理方法SELECT SCOPE_IDENTITY() 可能会出错<br /> <br />可以用Statement 类的 getGeneratedKeys 方法返回包含一列,列名为GENERATED_KEYS的结果集,内容为自动生成的键<br /><br /> 1、设置PreparedStatement(推荐)<br /> <br />PreparedStatement  ps = conn.prepareSt

feiwei的专栏 1134

大模型_WIN10使用hyper-v安装Ubuntu24.04虚拟机_配置独立静态IP地址_连接外网_并与内网其他机器互通_通过容器安装Dify_超详细安装过程002--人工智能工作笔记0247

本文详细描述了在Hyper-V环境中配置网络、安装Ubuntu虚拟机、设置IP地址、安装Docker以及部署Dify应用的过程。首先,通过Hyper-V管理器创建外部虚拟交换机(ExternalSwitch),并配置本机、虚拟交换机和Ubuntu虚拟机的IP地址,确保网络互通。接着,在Ubuntu虚拟机中安装Open-VM-Tools和Docker,并配置Docker的国内镜像源。最后,通过Git克隆Dify源码,使用Docker Compose启动Dify应用,完成部署。整个过程涵盖了网络配置、虚拟机管理

添柴程序猿的专栏 1752

历年安徽省省赛AHOI初中组考点分类汇总考点分类汇总

持续更新中.....

weixin_42358969的博客 818

Select SCOPE_IDENTITY()失效问题

今天上午11点开始测试页面如下代码错误:insql="insert into tg_shenqing(sq_from,sq_xmid,sq_hyid,sq_hyname,sq_qq,sq_email,sq_tel,sq_bmzyid,sq_suid,sq_beizhu,addtime,ip,sq_sh,sq_expertID,sq_expertName) values(2,'"&schid&"',

a545571406的专栏 1765

Android 14.0 开机广播接收慢广播延迟问题分析

在14.0的系统rom定制化开发中,在某些时候在接收开机广播的时候发现,过了一分钟才收到开机广播,接下来就需要分析下 开机广播的相关分发机制,来处理下相关问题

安卓兼职framework和app工程师的博客 631

SQL SERVER 使用触发器的情况下@@IDENTITY不准确的问题

       @@IDENTITY是返回最后插入的标识值的系统函数。在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值。 如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL。 如果插入了多个行,生成了多个标识值,则 @@IDENTITY 将返回最后生成的标识值。        我们常用@@IDENTI...

二月十六的博客 2441

ISO13849功能安全从入门到精通(3):安全功能及其对降低风险的贡献4

例如,如果机器必须在有限速度下运行时进行设置,那么在低加速度值下进行设置时,参数P1将是正确的选择:随着危险缓慢出现并给予足够的运动自由,操作员将能够移出危险区域。例如,在无故障的条件下,在操作者的手的方向移动的滚子不能陷住它。在所有其他情况下,F1是正确的选择,前提是危险暴露的持续时间不超过机器总操作时间的1/20。需求来源于必要的风险降低。由于这些考虑而降低的PLr在任何情况下都不得低于通过比较方式考虑的机器的PLr,因为并不能从事故发生率低和严重程度低得出实施的安全功能提供的安全水平高于要求。

wdconan001的博客 837

计算机组成原理(第三版)唐朔飞-第四章存储器-课后习题

计算机组成原理(第三版)唐朔飞-第四章存储器-课后习题

weixin_45735391的博客 17万+

Sqlserver——异常总结——output子句和SCOPE_IDENTITY()函数同时使用出现的bug

无意间发现的当使用Update 的 Output 子句和SCOPE_IDENTITY() 函数一起使用的时候,会出现SCOPE_IDENTITY()函数的值为null 下面为代码示例 1、创建测试表 CREATE TABLE tt1 (id INT IDENTITY,name NVARCHAR(20)) CREATE TABLE tt2 (id INT IDENTITY, nam...

qq_40205468的博客 524

倍福--手动加入第三方伺服的配置

客户在没有硬件情况下,希望手动配置硬件,添加第三方驱动器,本文介绍其操作流程 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 操作步骤 3 2.1. 添加电机XML文件 3 2.2. 创建EtherCAT 3 2.3. 添加新建项 3 2.4. 选择型号 4 2.5. 关联NC轴 5 软硬件版本 1.1. 倍福Beckhoff 1.1.1. 控制器硬件 TwinCAT控制制器,PC或者EPC,包括: 嵌入式控制器:CX5020-

weixin_41883890的博客 5329

获取SQL-SERVER数据库insert into操作的主键返回值,SCOPE_IDENTITY

     插入一条记录后想要立刻获取其数据表中的主键返回值。这个主键是自动生成的,其实实现的方式有很多,比如再进行一次查询,获取出来。或者在插入数据之前取 出最大值,在最大值上面加一等等,方法很多,但是有些很不方便。       个人感觉最快的方式就是,在插入数据后直接获取主键的值,然后返回过来。方法如下:sql语句如下:INSERT INTO tableName (fieldname .....

weixin_34211761的博客 203

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

关于 存储过程返回值

有一个表,其主键是int并且为自动增长的。当我向这个表中插入一项并且不提供主键的时候,数据库会自动添加一个唯一的主键。 问题是:怎么得到刚刚插入的那一项的主键值?1、存储过程有两种方式返回值:第一:通过output 参数第二:通过return来实现 而在你的存储过程已经声明了一个output参数,只要你在你的存储过程已经给这个值赋值了,它就能返回回去. 建议一般用output参数,因为它可以...

weixin_30651273的博客 306

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

加了触发器后的Select @@identity失效的解决

select SCOPE_IDENTITY()

编程开发资料库 257

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

获取sql server中自增量之scope_identity(),@@Identity,IDENT_CURRENT的区别

http://www.lmwlove.com/ac/ID480 在sqlserver2005,如果要获某个表最新增加的自增量,我们都知道,可以使用COPE_IDENTITY、 IDENT_CURRENT和@@IDENTITY三个函数,因为它们都返回插入到标识列中的值。但这三个函数是不是不管什么时候,返回的值都一样的呢?答案是错的,本人以前正是因为没有理解到这三个函数的区别,所以取到了错...

weixin_30732487的博客 237

MSSql Server 中@@IDENTITY与SCOPE_IDENTITY()

@@IDENTITY 和 SCOPE_IDENTITY 可以返回当前会话中的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。 做个笔记,以防忘了。 转载于:https://www.cnblogs.com/bcszz/archive/2012/03/15/2398394.html...

weixin_30429201的博客 133

浅谈SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY

1.IDENT_CURRENT() 【备注】:返回为指定的表或视图生成的最后一个标识值。所生成的最后一个标识值可以针对任何会话和任何作用域。 【语法】:IDENT_CURRENT('table_name') 【参数】:table_name 其标识值被返回的表的名称。tabl

Hero_ChenLiu的专栏 934

SCOPE_IDENTITY()使用方法

select SCOPE_IDENTITY()返回上面操作的数据表最后row的IDENTITY 列的值;返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值。一个作用域就是一个模块——存储过程、触发器、函数或批处理。因此,如果两个语句处于同一个存储过程、函数或批处理中,则它们位于相同的作用域中。SELECT   @@IDENTITY返回上面操作最后一个数

lisky119的专栏 1639

MSSQL @@IDENTITY与SCOPE_IDENTITY()简介

http://database.9sssd.com/mssql/art/1058 在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含语句生成的最后一个标识值。如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL。如果插入了多个行,生成了多个标识值,则 @@IDENTITY 将返回最后生成的标识值。如果语句触发了一个或多

mituan1234567的专栏 768

关于SCOPE_IDENTITY获取自增字段值的问题

看了一下,SCOPE_IDENTITY貌似是最靠谱的,没有并发的问题。 但是我测试了一下,在不到40w的表里新增数据,用SCOPE_IDENTITY获取值很慢啊!比@@INDENTITY慢多了,@@INDENTITY大概在15ms以内,而SCOPE_IDENTITY就要100多

tianwailaibin的专栏 2305

SCOPE_IDENTITY()

@@IDENTYITY,SCOPE_IDENTITY的主要区别:在有触发器中而且触发器的内容里面含有插入标识符的操作的时候,@@IDENTITY则返回的是触发器里面新插入标识符的值而SCOPE_IDENTITY则是不变,即离该语句上面最近的标识符的值。      SCOPE_IDENTITY()测试用例:   --会话1,第一条返回1,第二条还是返回1,可得知SCOPE_IDENTI

liuyu5210的博客 4056
上一篇: 字节数组格式化为16进制字符串
下一篇: mongodb安装与使用
ComputerInBook
博客等级 码龄19年 1168粉丝 464原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值