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自动生成模板,手动构造参数化语句并创建计划指南,步骤如下:
- 手动定义参数化查询语句,将ODBC时间戳替换为标准参数(如
@StartTime) - 明确指定参数的数据类型(需与
TIME列的类型匹配) - 直接调用
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
相关产品推荐
相关产品推荐

