你目前正处于脱机状态,正在等待 Internet 重新连接

FIX:"试图将不能为空的列的值设置为 NULL"错误消息,当您运行查询时使用 ISNULL() 函数来选择 SQL Server 2008 中的可空列的值

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 981037
Microsoft 分布 Microsoft SQL Server 2008 修复程序作为一个可下载的文件。因为该修补程序是累积性的因此每个新版本包含的所有修补程序和所有安全修复程序以前 SQL Server 2008 中包含的修补都程序版本。
症状
请考虑以下情形:
  • 在 Microsoft SQL Server 2008,您要运行查询以选中为空的列中的值使用 ISNULL() 函数。
  • 在为空的列的另一个表与联接包含可为空的列的表。
  • 由查询优化器创建的查询计划使用哈希联接、 一个后台或 JOIN 运算符下的一个排序表。
在这种情况下您会收到以下错误消息:
消息 681,级别 16 状态 3,2 行
试图将不能为空的列的值设置为 NULL。
原因
查询优化器确定 ISNULL() 函数中引用的列是不可为空,因为联接运算符拒绝 NULL 值。然后,查询计划中查询优化器将推送下面 JOIN 运算符 ISNULL() 函数中的表达式。此外,该表达式的值可以为 NULL。但是,查询优化器不会 re-derive 为表达式为空性属性。然后在查询计划中来实现哈希联接,将在短或排序表包含表达式的使用工作表。此外,工作表中的相应列被声明为不可为空。当 SQL Server 查询引擎尝试将空值插入到工作表时,则会出现此错误。
解决方案
累积更新 7 SQL Server 2008 Service Pack 1 中第一次释放此问题的修复程序。有关此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
979065累积更新包 7 为 SQL Server 2008 Service Pack 1
注意因为这些版本是累积性的因此每个新的修补程序版本包含的所有修补程序和所有安全修复程序以前 SQL Server 2008 中包含的修补都程序版本。我们建议您考虑应用最新的修补程序版本包含此修补程序。有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
970365SQL Server 2008 生成之后 SQL Server 2008 Service Pack 1 发布发布
Microsoft SQL Server 2008 修复程序会创建特定 SQL Server 服务包。必须将 SQL Server 2008 Service Pack 1 修补程序应用到 SQL Server 2008 Service Pack 1 的安装。默认状态下,SQL Server service pack 中提供的任何修补程序包含在下一个 SQL Server 服务包中。
替代方法
要变通解决此问题,使用下列方法之一。

方法 1

从查询中删除 ISNULL() 函数。

注意因为该函数中的列来自拒绝 NULL 值的 JOIN 运算符,ISNULL() 函数是多余的。

方法 2

重写查询,以便在查询计划不使用哈希联接、 一个后台或排序表中。例如对于如果查询中包含 ORDER BY 子句创建一个群集或 covering 的索引,它提供了所需的排序,并包含所有必需的列。您在使用此方法时查询优化器不使用排序表中。
状态
Microsoft 已经确认这是在"适用于"一节中列出的 Microsoft 产品中的问题。
参考
有关 SQL Server 增量的服务模型信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
935897一个增量的服务模型是可从 SQL Server 团队提供报告的问题的修补程序


有关命名 SQL Server 更新架构的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
822499Microsoft SQL Server 软件更新程序包的新命名架构


有关软件更新术语的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
824684用于描述 Microsoft 软件更新的标准术语的说明

警告:本文已自动翻译

属性

文章 ID:981037 - 上次审阅时间:03/15/2010 12:41:22 - 修订版本: 1.1

Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Workgroup

  • kbmt kbhotfixserver kbexpertiseadvanced kbsurveynew kbqfe kbfix KB981037 KbMtzh
反馈