Sql server SQL Server sp_create_plan_guide等子句参数

Sql server SQL Server sp_create_plan_guide等子句参数,sql-server,parameters,sql-like,sql-execution-plan,Sql Server,Parameters,Sql Like,Sql Execution Plan,在创建计划指南时,我在处理LIKE子句时遇到困难。我遇到的真正问题是巨大的,所以我编了一个很小的问题来描述我的问题。以下是我的麻烦总结: 我正在尝试为其创建计划的查询是: SELECT ID, Name FROM Company WHERE Addres LIKE '%somestring%' AND Site = 'whateversite' 所以我运行了sp_get_query_template来获取查询模板,它看起来像这样: DECLARE @my_templatetext nvarch

在创建计划指南时,我在处理LIKE子句时遇到困难。我遇到的真正问题是巨大的,所以我编了一个很小的问题来描述我的问题。以下是我的麻烦总结:

我正在尝试为其创建计划的查询是:

SELECT ID, Name FROM Company WHERE Addres LIKE '%somestring%' AND Site = 'whateversite'
所以我运行了sp_get_query_template来获取查询模板,它看起来像这样:

DECLARE @my_templatetext nvarchar(max)
DECLARE @my_parameters nvarchar(max)
EXEC sp_get_query_template
@templatetext = N'SELECT ID, Name FROM Company WHERE Addres
LIKE ''%somestring%'' AND Site = ''whateversite''',
@templatetext = @my_templatetext OUTPUT,
@parameters = @my_parameters OUTPUT
SELECT @my_templatetext
SELECT @my_parameters
EXEC sp_create_plan_guide
@name = N'TSY_PLAN2',
@stmt = N'SELECT ID, Name FROM Company WHERE Addres LIKE ''%somestring%''
AND Site = @0',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@0 nvarchar(4000)'
EXEC sp_create_plan_guide
@name = N'TSY_PLAN2',
@stmt = N'SELECT ID, Name FROM Company WHERE Addres LIKE @1like
AND Site = @0',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@1like nvarchar(4000),@0 nvarchar(4000)'
回报是:

参数化查询:

SELECT ID, Name FROM Company WHERE Addres LIKE '%somestring%' AND Site = @0
和参数:

@0 nvarchar(4000)
然后,我将最终运行sp_create_plan_guide过程,如下所示:

DECLARE @my_templatetext nvarchar(max)
DECLARE @my_parameters nvarchar(max)
EXEC sp_get_query_template
@templatetext = N'SELECT ID, Name FROM Company WHERE Addres
LIKE ''%somestring%'' AND Site = ''whateversite''',
@templatetext = @my_templatetext OUTPUT,
@parameters = @my_parameters OUTPUT
SELECT @my_templatetext
SELECT @my_parameters
EXEC sp_create_plan_guide
@name = N'TSY_PLAN2',
@stmt = N'SELECT ID, Name FROM Company WHERE Addres LIKE ''%somestring%''
AND Site = @0',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@0 nvarchar(4000)'
EXEC sp_create_plan_guide
@name = N'TSY_PLAN2',
@stmt = N'SELECT ID, Name FROM Company WHERE Addres LIKE @1like
AND Site = @0',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@1like nvarchar(4000),@0 nvarchar(4000)'
当我运行我在第一个块中发布的查询时,它工作得非常好!但当我提交不同的地址“%Somestring%”时,它就不起作用了。这是肯定的,因为查询模板中类似于“%somestring%”的部分。。。但我不知道如何使它与类似子句中的参数一起工作

我尝试使用LIKE子句的参数创建查询计划,结果如下:

DECLARE @my_templatetext nvarchar(max)
DECLARE @my_parameters nvarchar(max)
EXEC sp_get_query_template
@templatetext = N'SELECT ID, Name FROM Company WHERE Addres
LIKE ''%somestring%'' AND Site = ''whateversite''',
@templatetext = @my_templatetext OUTPUT,
@parameters = @my_parameters OUTPUT
SELECT @my_templatetext
SELECT @my_parameters
EXEC sp_create_plan_guide
@name = N'TSY_PLAN2',
@stmt = N'SELECT ID, Name FROM Company WHERE Addres LIKE ''%somestring%''
AND Site = @0',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@0 nvarchar(4000)'
EXEC sp_create_plan_guide
@name = N'TSY_PLAN2',
@stmt = N'SELECT ID, Name FROM Company WHERE Addres LIKE @1like
AND Site = @0',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@1like nvarchar(4000),@0 nvarchar(4000)'
但它根本不起作用。。。我甚至使用了很多百分比、comas和段落的组合,但一点运气都没有

经过许多绝望的尝试和失败后,我通过实际的执行计划函数发现,优化器根本不把“参数”看作参数。。。它可以看到真实的“%somestring%”值。Optimizer将查询视为:

SELECT ID, Name FROM Company WHERE Addres LIKE '%somestring%'
AND Site = @0'
如果我填写不同的“%somestring%”,我需要不同的计划指南吗?由于“%somestring%”经常更改,这会使计划指南变得毫无用处。我拒绝相信这是不可能的!我需要我的优化程序每次都使用哈希连接,而不是LIKE子句中的特定字符串

最后,在现实生活中,我通过摆弄索引来解决这个问题。。。但是花了很多时间!作为一个快速的工作,我想做计划指南

您能帮助我如何为LIKE子句中的“参数”创建计划指南吗?有可能吗?我是否需要以某种方式将我的数据库设置为“像子句一样参数化”