症状
假设你有一个表,其中包含 Microsoft SQL Server 2008 R2、SQL Server 2012 或 SQL Server 2014 中的 DML 触发器,并且在该触发器中,你可以使用其他表联接插入/删除的表。 在此表上执行 DML 语句时,可能会在触发器编译期间出现访问冲突,并且你会收到以下错误:
当前命令出现严重错误。 应丢弃结果(如果有)。
此外,在 SQL Server 错误日志中记录以下错误:
<日期><时间> spid # * * * 堆栈转储被发送到 <FilePath>\SQLDumpxxx.txt<日期 ><>spid # SqlDumpExceptionHandler: Process # 生成的严重异常 c0000005 EXCEPTION_ACCESS_VIOLATION。 SQL Server 正在终止此进程。<日期><时间> spid # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *><<>><<><2 日期><时间><5 spid # * ><6 日期><时间><9 spid #><0 日期><时间><3 Spid # *><4 日期><时间><7 SPID # *><8 日期><时间>Spid # * 异常地址 = 00000000009E4F2A 模块(sqlservr + 00000000002D4F2A)<日期><时间> spid # * 异常代码 = C0000005 EXCEPTION_ACCESS_VIOLATION<日期><时间>spid # * 写入地址0000000000000000时发生访问冲突<><日期>spid # * 输入缓冲区510字节-<日期><时间> spid # * SQL_query_code
解决方案
在 SQL Server 的以下累积更新中,此问题首先已修复。
SQL Server 2012 SP2 的累积更新1 /en-us/help/2976982
SQL Server 2014 的累积更新2 /en-us/help/2967546
SQL Server 2012 SP1 的累积更新10 /en-us/help/2954099
SQL Server 2008 R2 SP2 的累积更新12 /en-us/help/2938478
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 查看 SQL Server 的最新累积更新:
解决方法
若要解决此问题,请不要直接在查询中直接使用已插入/已删除的表将其与其他表联接,而是将其缓存在 temp 表中并在查询中使用 temp 表。
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。