我在客户端的 SQL Server 2005 框上发生了一个奇怪的错误。我们为他们提供了一个数据视图,其中填充了一个带有 CTE 的查询,该 CTE 具有多个连接/子查询,对包含 XML blurb 的 NTEXT 字段执行一些文本值解释
我知道我们可以使用其他字段类型和/或方法,但这是有充分理由的,我希望我不必在这里解释。
问题是由于某种原因,此查询在 SQL Server 上创建了一个致命异常。
附上导致错误的实际T-SQL的业务端的浓缩版
declare @@dtDateStart datetime, @@dtDateEnd datetime
set @@dtDateStart = getdate()
Set @@dtDateEnd = dateadd(year, 1, @@dtDateStart)
;with qItems
(date_created, SYSTEM_ID, LegalEntity) as
( select i.date_created,
i.externalKey as SYSTEM_ID,
case when i.HasLegalEntity > 0 then
substring(i.message, charindex('<LegalEntity>',i.message)+13, charindex('</LegalEntity>',i.message)-charindex('<LegalEntity>',i.message)-13)
else '' end as LegalEntity
from (select *, charindex('<LegalEntity>', message) as HasLegalEntity from dbo.INT_Error_Queue) as i
where i.date_created between @@dtDateStart and @@dtDateEnd)
select
QItems.date_created,
QItems.SYSTEM_ID,
Qitems.LegalEntity
from QItems
WHERE
(isnull(Qitems.LegalEntity, '') not in (select key_value from Special_app_Settings where key_name = 'EntityName'))
一开始怀疑是不是和where子句有关,因为[key_value]
on[Special_app_Settings]
是type nvarchar(4000)
,[i].[message]
on[INT_Error_Queue]
是type [ntext]
,不知道会不会报错。如果我删除 where 子句,则不会发生错误。
特此从 SQL Server 日志转储:
03/13/2013 10:30:24,Server,Unknown,A user request from the session with SPID 101 generated a fatal exception. SQL Server is terminating this session. Contact Product Support Services with the dump produced in the log directory.
03/13/2013 10:30:24,Server,Unknown,Error: 17310<c/> Severity: 20<c/> State: 1.
03/13/2013 10:30:24,spid101,Unknown,External dump process return code 0x20000001.<nl/>External dump process returned no errors.
...
03/13/2013 10:30:20,spid101,Unknown,* BEGIN STACK DUMP:
03/13/2013 10:30:20,spid101,Unknown,*
03/13/2013 10:30:20,spid101,Unknown,* *******************************************************************************
03/13/2013 10:30:20,spid101,Unknown,SqlDumpExceptionHandler: Process 101 generated fatal exception c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this process.
03/13/2013 10:30:20,spid101,Unknown,***Stack Dump being sent to C:\Program Files\Microsoft SQL Server\MSSQL.2\MSSQL\LOG\SQLDump0039.txt
03/13/2013 10:30:20,spid101,Unknown,Using 'dbghelp.dll' version '4.0.5'
有谁知道为什么会发生这种情况?
我认为您可能是我之前遇到过的问题的受害者,该问题是通过 Service Pack 2 的累积更新引入的。您的数据库的兼容级别是 80 (SQL 2000) 吗?
有关修补程序的详细信息,请参阅Microsoft KB 938102,但我建议您升级到最新的服务包(或者绝对是更新的累积服务包)。
本质上,查询引擎正在评估您的 where 子句并使用非 ANSI 运算符(例如 *=)创建连接,然后您就会遇到此 Sql 错误。如果满足以下条件,则会出现此问题: