XP_API 弃用公告是否意味着未来将不支持 sp_executesql?

Bat*_*ech 5 sql-server sql-server-2008-r2 extended-events extended-stored-procedure

我在 SQL 2008 R2 中设置了一个扩展事件会话来跟踪deprecation_final_supportdeprecation_announcement事件。我注意到我的日志中有一些“deprecation_announcement”事件带有“XP_API”的“特性”,这些事件似乎都是使用SP_EXECUTESQL.

事件消息说:

SQL Server 的未来版本中将删除扩展存储过程 API。避免在新的开发工作中使用此功能,并计划修改当前使用它的应用程序。

sql_text来自事件的操作的一个示例是:

exec sp_executesql N'DECLARE @c varbinary(128);SET @c=cast(@userName as varbinary(128));SET CONTEXT_INFO @c;', N'@userName varchar(128)', @userName = 'MYDOMAIN\myuser';
Run Code Online (Sandbox Code Playgroud)

master.sys.SP_EXECUTESQLproc 列在对象资源管理器中的“数据库 > 系统数据库 > 主 > 可编程性 > 扩展存储过程 > 系统扩展存储过程”下。

这是否意味着sp_executesqlSQL Server 的未来版本将不支持它?

Han*_*non 4

SQL Server 2017 已弃用的数据库引擎功能列表显示为XP_API现在不支持的功能列表的“功能名称”。已弃用的功能列表包括:

srv_alloc
srv_convert
srv_描述
srv_getbindtoken
srv_got_attention
srv_消息_处理程序
srv_参数数据
srv参数信息
srv_参数长度
srv_parammaxlen
srv_参数名称
srv_paramnumber
srv_参数集
srv_paramset输出
srv_paramstatus
srv_参数类型
srv_pfield
srv_pfieldex
srv_rpcdb
srv_rpc名称
srv_rpc编号
srv_rpc选项
srv_rpcowner
srv_rpcparams
srv_senddone
srv_发送消息
srv_发送行
srv_setcoldata
srv_setcollen
srv_setutype
srv_willconvert
srv_wsendmsg

这些项目都是扩展存储过程 API的一部分,现已弃用。

的文档sp_executesql没有提及它已被弃用。尽管这可能是一个疏忽错误,但核心功能似乎不太可能被弃用。想象一下全世界需要改造的所有代码。

与弃用相关的扩展事件项可能会标记 sp_executesql 对xp_api上面列出的一项或多项的某些内部使用。由于 sp_executesql 是在引擎中实现的扩展存储过程,因此 Microsoft 将重构 sp_executesql 代码以避免调用这些已弃用的事件,或者不会弃用它们供内部使用。

这个问题的标签是SQL Server 2008 R2;如果您在 SQL Server 2017 中运行扩展事件会话并查看deprecation_announcementdeprecation_final_support事件,您不会看到sp_executesql触发事件。为了测试这一点,我使用了这个会话定义:

CREATE EVENT SESSION [deprecated events] ON SERVER 
ADD EVENT sqlserver.deprecation_announcement
(
    ACTION (
        package0.event_sequence
        ,sqlserver.client_app_name
        ,sqlserver.database_name
        ,sqlserver.is_system,sqlserver.sql_text
        )
)
, ADD EVENT sqlserver.deprecation_final_support
    (
        ACTION
        (
            package0.event_sequence
            ,sqlserver.client_app_name
            ,sqlserver.database_name
            ,sqlserver.is_system
            ,sqlserver.sql_text
        )
    )
ADD TARGET package0.ring_buffer (SET max_memory=(10240))
WITH (STARTUP_STATE=OFF);
ALTER EVENT SESSION [deprecated events] ON SERVER STATE=START;
GO
Run Code Online (Sandbox Code Playgroud)

然后运行这段代码,它使用sp_executesql

DECLARE @cmd nvarchar(max);
SET @cmd = 'SELECT CurrentDate = GETDATE();';
EXEC sys.sp_executesql @cmd;
Run Code Online (Sandbox Code Playgroud)

[deprecated events]执行代码后,会话的环形缓冲区输出没有显示任何消息。但是,如果您运行此代码(其中包含sp_helpremotelogin已弃用列表中的 )您确实会在环形缓冲区输出中看到项目:

EXEC sp_helpremotelogin @remoteserver = 'test', @remotename = NULL;
Run Code Online (Sandbox Code Playgroud)