症状
假设在 Microsoft SQL Server 2014 中有一个具有聚集列存储索引的表。 对表运行 DDL 查询以更改现有列的数据类型。 例如,通过运行以下命令,将 Column_1 Table_1 的数据类型从 VARCHAR (499)更新到 NVARCHAR (500):
ALTER TABLE Table_1 ALTER COLUMN Column_1 NVARCHAR(500) NOT NULL
在这种情况下,会发生多个断言故障,并且你会收到以下错误消息:
位置: <文件路径> \Xmcolenc.inl:413Expression: PF_CURRENT_STATUS = = PFS_OK (在 XMColumnEncoder 中<无符号 char *>:: EncodeValueForSecondary) spid: <SPID>进程 Id: <进程 id >说明: hr:0X0Location: <文件路径> \xmerror.cpp:43Expression:0(在 PFSetLastError 中) : <进程 id>说明: hr:0x0
此外,SQL Server 错误日志文件夹中会生成多个内存转储文件,并且在 SQL Server 错误日志中记录了类似于以下的多个错误消息:
<日期时间> Spid<ID> * * * 堆栈转储被发送到 <磁盘名称>: \Program Files\Microsoft SQL Server\MSSQL12。SQL2014\MSSQL\LOG\SQLDump0002.txt<日期时间> Spid<ID> * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * <日期时间> spid<Id > * <日期时间> spid<id > * 开始堆栈转储: <的日期时间> spid <Id> * <日期时间> spid<id><*专用服务器内部版本。 <日期时间> Spid<id > * Date Time <日期时间> spid<ID > * 位置: <> \xmcolenc.inl 的文件路径: 413<日期时间> Spid<ID > * 表达式: PF_CURRENT_STATUS = = PFS_OK<日期时间> spid<ID > * (在 XMColumnEncoder 中<未签名的 char *> :: EncodeValueForSecondary) <的日期时间> spid<id> * spid <> *进程id<*进程 id 60 ID: 3680<日期时间> Spid<ID> * 说明: Hr: 0x0<日期时间> spid<id>* <><> spid <Id> * 输入缓冲区136字节-<的日期时间> 的输入缓冲区 Table_1 * alter TABLE 更改列 COL1 NVARCHAR (500)不为 NULL;
解决方案
应用此修补程序后,当 DDL 查询失败时,可能会收到以下新错误消息:
ALTER TABLE 语句失败,因为辅助字典已达到最大大小限制。 考虑删除列存储索引,更改列,然后创建新的列存储索引
此修补程序还可防止在 SQL Server 错误日志中生成内存转储文件。此问题首先在 SQL Server 的以下累积更新中修复:
SQL Server 的每个新的累积更新均包含以前的累积更新中包含的所有修补程序和所有安全修补程序。 我们建议你下载并安装 SQL Server 的最新累积更新:
状态
Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。