You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sp_get_query_template搭配ODBC timestamp创建计划指南失效问题

解决ODBC时间戳导致计划指南无法生效的问题

你的SQL查询使用了ODBC时间戳格式{ts '2023-10-02 08:09:12'},调用sp_get_query_template生成模板创建计划指南时,由于SQL Server无法正确识别这种ODBC特定字面量为可参数化项,导致指南无法匹配实际执行的查询。

解决方案

放弃依赖sp_get_query_template自动生成模板,手动构造参数化语句并创建计划指南,步骤如下:

  1. 手动定义参数化查询语句,将ODBC时间戳替换为标准参数(如@StartTime)
  2. 明确指定参数的数据类型(需与TIME列的类型匹配)
  3. 直接调用sp_create_plan_guide创建指南

具体脚本

DECLARE @stmt nvarchar(max) = N'SELECT COUNT(*)
FROM (
    SELECT DISTINCT USER_NAME
    FROM LICENSE
    WHERE RESTRICTED_USE = ''T''
    AND ALLOCATED = ''T''
    UNION ALL
    SELECT USER_NAME
    FROM LICENSE
    WHERE RESTRICTED_USE = ''T''
    AND ALLOCATED = ''F''
    AND "TIME" >= @StartTime
) AS TEMP_ALIAS';

DECLARE @params nvarchar(max) = N'@StartTime DATETIME2'; -- 若TIME列是DATETIME类型,改为DATETIME

EXEC sp_create_plan_guide   
    N'UsersCountTable',   
    @stmt,   
    N'TEMPLATE',   
    NULL,   
    @params,   
    N'OPTION(PARAMETERIZATION FORCED)';

验证指南是否生效

  • 查询系统视图确认指南已创建:
SELECT name, is_disabled, query_text, parameters
FROM sys.plan_guides
WHERE name = 'UsersCountTable';
  • 执行目标查询后,通过sys.dm_exec_query_stats和sys.dm_exec_query_plan检查是否使用了该计划指南对应的执行计划。

注意事项

  • 确保后续执行的查询与模板语句的结构完全一致,仅时间参数值不同
  • 参数类型必须与TIME列的数据类型严格匹配,否则可能导致类型转换或匹配失败

内容的提问来源于stack exchange,提问作者Fausto Galati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:28:38