Microsoft 在一个可下载文件中分发 Microsoft SQL Server 2012 修复程序。 由于修补程序是累积的,因此每个新版本都包含以前的 SQL Server 2012 更新版本附带的所有修补程序和所有安全更新。
症状
假设你在 Microsoft SQL Server 2012 中的多个会话上同时运行多个 xp_cmdshell 存储过程。 在这种情况下, xp_cmdshell 存储过程的第一次执行在最后一次执行完成之前不会完成。
原因
出现此问题的原因是,当你同时运行 xp_cmdshell 存储过程时打开的进程会继承句柄。 CreateProcess API 需要处理继承以重定向标准输出和错误消息。 如果同时运行多个 xp_cmdshell 存储过程,则新打开的进程可以继承现有进程的句柄。 但是, xp_cmdshell 存储过程将等待句柄由所有打开的进程关闭。 因此,当多个进程继承该句柄时,所有 xp_cmdshell 执行都必须等待,直到该句柄被最长运行的进程关闭。
解决方案
若要解决此问题,请应用以下累积更新。 此更新添加了用于阻止跨进程的句柄继承的 CreateProcess API STARTUPINFOEX 选项。
累积更新信息
SQL Server 2012 Service Pack 1 的累积更新包1
此问题的修补程序首次在累积更新1中发布。有关如何获取此累积更新包的 SQL Server 2012 Service Pack 1 的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2765331 SQL Server 2012 Service Pack 1 的累积更新包1注意 由于这些版本是累积的,因此每个新的修复版本都包含以前的 SQL Server 2012 修复版本附带的所有修补程序和所有安全修补程序。 我们建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2772858 在发布 SQL Server 2012 Service Pack 1 之后发布的 SQL Server 2012 版本
SQL Server 2012
此问题的修补程序首次在累积更新4中发布。有关如何为 SQL Server 2012 获取此累积更新包的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2758687 SQL Server 2012 累积更新程序包4注意 由于这些版本是累积的,因此每个新的修复版本都包含以前的 SQL Server 2012 修复版本附带的所有修补程序和所有安全修补程序。 我们建议你考虑应用包含此修补程序的最新修复版本。 有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
2692828 在 SQL Server 2012 发布后发布的 SQL Server 2012 版本
状态
Microsoft 已确认这是在“适用范围”部分中列出的 Microsoft 产品存在的问题。
参考
有关 CreateProcess 函数的详细信息,请转到以下 MSDN 网站:
有关 CreateProcess 函数的常规信息有关 xp_cmdshell 存储过程的详细信息,请转到以下 MSDN 网站:
有关 xp_cmdshell 存储过程的常规信息 有关类似问题的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
315939 PRB:在 CreateProcess 调用期间,子元素继承了不应的句柄