FIX: fn_get_sql 函数返回句柄的 SQL 的文本 Sysprocesses 系统表中

文章翻译 文章翻译
文章编号: 325607 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文讨论了为实现以下更改 SQL Server 2000 功能修复程序:
  • 此修补程序创建一个新 fn_get_sql 系统表值函数。
  • 此修补程序将这三个新列添加到 主控形状的末尾sysprocesses 系统表:
    • sql_handle(二进制)
    • stmt_start(整数)
    • stmt_end(整数)

  • 此修补程序创建一个新的跟踪标记、 跟踪标记 2861年。

解决方案

若要解决此问题,获得最新的 service pack,对于 Microsoft SQL Server 2000。有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
290211如何获取最新的 SQL Server 2000 服务包
注意Microsoft SQL Server 2000 Service Pack 3 的版本之前创建以下修复程序。

修补程序文件

没有实现 fn_get_sql 函数的 SQL Server 2000 修补程序。

请联系 Microsoft 产品支持服务以获取此修复程序。此修补程序的英文版具有的文件属性 (或更新的文件属性) 在下表中列出。日期和时间对这些文件列出在协调世界时 (UTC)。当您查看文件信息时,将转换为本地时间。若要 UTC 与本地时间之间的时差使用控制面板中的日期和时间工具中的 时区 选项卡。
   Date         Time      Version    Size              File name
   -----------------------------------------------------------------

   07/01/2002   4:50 PM   8.00.652   7,285 kilobytes   Sqlservr.exe
				
注意由于存在文件依赖性最新的修补程序或功能,它包含该文件可能还包含其他文件。

重要 如果您希望此修复程序的功能,必须应用一个 Sqlservr.exe 生成晚于或等于 8.00.652,并且您必须运行在 Sp2_qfe_serv_uni.sql 包括在此修复程序中的文件。有关详细的信息,请参阅该 Readme.txt 修复程序文件中包含的文件。

状态

Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中的问题。Microsoft SQL Server 2000 Service Pack 3 中,第一次已得到纠正此问题。

更多信息

下面是一个定义和 fn_get_sql 系统表值函数的语法。

fn_get_sql

返回为指定的句柄引用的 SQL 文本。

语法

fn_get_sql ([@ SqlHandle =] SqlHandle

参数

[@ SqlHandle =]SqlHandle

二进制句柄值。SqlHandle 是 binary(20) 与没有默认值。

返回的表

收起该表格展开该表格
列名称数据类型说明
dbidsmallint数据库 id。在特殊 SQL 语句的情况下为空。
objectidint数据库对象的 ID。在特殊 SQL 的情况下为空语句。
数字smallint过程分组如果分组中的数字。0 表示不是过程的项。在特殊 SQL 语句的情况下为空。
加密指示是否加密的对象:
0 = 不加密
1 = 加密
文本文本SQL 文本。在加密对象的情况下为空。

说明

Fn_get_sql 是系统表值函数返回有关指定 SQLHANDLE 的 SQL 文本。您可以获得有效 SQLHANDLE sql_handlesysprocesses 系统表的列中。

如果您将不再存在的句柄传递在缓存中,fn_get_sql 将返回一个空结果集。如果传递的无效句柄将中止批处理,并且您收到以下错误消息:
服务器: 消息 569,级别 16 状态 1 过程 fn_get_sql 行 12 的句柄传递给 fn_get_sql 无效。
SQL Server 无法缓存如大容量操作语句和与字符串大于 8 KB 的语句的某些 TRANSACT-SQL 语句。 这些语句的句柄不是通过 fn_get_sql 函数可检索的。

文本列筛选可能包含密码的文本。查看在"限制跟踪"SQL Server 联机丛书中的主题有关的与安全相关存储过程不受监视的详细信息。

权限

只有 sysadmin 固定的服务器角色的成员可以运行 fn_get_sql 函数。

示例

类似于 DBCC INPUTBUFFER 命令是 fn_get_sql 函数所返回的信息。在其中 DBCC INPUTBUFFER 是受限制如的情况下,使用 fn_get_sql 函数:
  • 当事件具有超过 255 个字符。
  • 当您需要返回最高当前存储过程的嵌套层。例如对于您有被命名 sp_1sp_2 的两个存储的过程。如果 sp_1 存储过程调用 sp_2 存储过程,和运行时 sp_2sysprocesses 系统表中获得句柄,fn_get_sql 函数将返回 sp_2 有关的信息。此外,fn_get_sql 函数返回整个存储的过程在当前最高嵌套级别。
数据库管理员可以使用 fn_get_sql 函数来帮助诊断问题的进程。管理员标识问题服务器进程 ID (SPID) 后,管理员可以为该的 SPID 检索该 SQLHANDLE 调用 fn_get_sql 函数与句柄并使用来确定问题的 SPID 的 SQL 文本的开始和结束偏移量。例如:
DECLARE @Handle binary(20)
SELECT @Handle = sql_handle FROM sysprocesses WHERE spid = 52
SELECT * FROM ::fn_get_sql(@Handle) 
				
也可以使用 fn_get_sql 函数不断监视服务器。例如对于一个客户端工具,它定期检索该 SQLHANDLE 语句开始和结束偏移量从 sysprocesses 系统表。该工具维护与 SQL 句柄作为唯一的键和值作为 fn_get_sql 函数的结果的 SQL 文本的高速缓存。sysprocesses 系统表行集合中的每一行的工具查找在它的缓存基于该 SQLHANDLE 文本。如果文本不在该工具的高速缓存中,该工具将然后调用 fn_get_sql 函数得到的文本,并将其保存在其缓存中。

跟踪标记 2861

跟踪标记 2861年指示 SQL Server SQL Server 将通常不缓存 (such as 简单 ad-hoc 查询、 设置语句、 提交事务和其他人) 的高速缓存中保留零成本计划。
  • 如果跟踪标志 2861年开启 fn_get_sql 函数可返回具有零成本计划的活动的 SQL 文本。如果关闭跟踪标志 2861 fn_get_sql 函数不能返回具有零成本计划活动的 SQL 文本。
  • 默认状态下,您应用此修复程序时跟踪标志 2861年处于关闭状态。

说明

在过程高速缓存中的对象的数目增加时跟踪标志 2861年处于打开状态。因为其他的对象是小,您将看到一个小增加所占用的过程高速缓存的内存。

SQL Server 2000 有一个有效的算法来查找任何指定的 SQL 语句的任何现有的执行计划。但是,由于提高了存储在过程高速缓存中的对象数目,它是系统的可能为关系引擎搜索的现有计划的时间可能会降低,并可能会对您的性能产生不利影响。

通常,在其中的数据库大小是比内存大小大得多的系统上系统是某些所需的内存压力。如果内存压力内存所需的其他对象,惰性写入器进程将解除分配在过程高速缓存中的对象。这将绑定过程高速缓存的大小,并将最大限度地减少潜在的不利影响,这种更改。

然而,在其中内存大小是比数据库大小还大的系统上系统通常不是内存压力。因此,对象不可以从过程高速缓存释放的内存需求由于和过程高速缓存的大小可以增长到点,它会对性能造成负面影响。

如果您注意对系统性能的不利影响,请按照下列步骤操作:
  1. 关闭跟踪标志 2861年。
  2. 从查询分析器运行 DBCC FREEPROCCACHE 命令。 您不必重新启动 SQL Server。

属性

文章编号: 325607 - 最后修改: 2005年9月27日 - 修订: 5.3
这篇文章中的信息适用于:
  • Microsoft SQL Server 2000 标准版
关键字:?
kbmt kbhotfixserver kbqfe kbsqlserv2000sp3fix kbfix kbinfo kbsqlserv2000presp3fix KB325607 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 325607
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com