查询在WHERE子句中使用参数挂起

时间:2016-04-19 15:19:32

标签: sql-server tsql reporting-services

我在这里理解查询有困难。 我的查询最终在报表中返回结果集,您可以在参数中指定Person以查看其数据。 我将我的Dimension表加入我的Employee表,以从Employee表返回Name。它看起来像这样

Declare @PM varchar(30)
Set @PM = 'John Smith'

SELECT....FullName, EmployeeID, .... 
FROM...
Inner Join EmployeesT on emp.EmployeeNumber = DimP.PersonID
WHERE FullName in (@PM)

注意:我的员工表在nvarchar中,而Dimension是varchar但我不认为这很重要,因为连接仍然有效。

现在,我在顶部设置了一个参数进行测试。

这是我的问题:如果我将WHERE子句切换为WHERE DimP.PersonID IN ('12345'),我的查询需要3秒才能运行。当我将查询更改为WHERE FullName in (@PM)时,查询将永远运行;它挂起并运行5+ minuets。有没有人遇到过类似的问题?

结果集生成具有多个"人员的正确数据"我想通过指定一个人而不是id来测试这个,但是当我将参数更改为Name时,查询会挂起..

2 个答案:

答案 0 :(得分:1)

可能是参数嗅探。它挂在另一个参数值的优化执行计划上。 在查询结束时尝试使用OPTION(OPTIMIZE FOR(@parm UNKNOWN))。

Declare @PM varchar(30)
Set @PM = 'John Smith'

SELECT....FullName, EmployeeID, .... 
FROM...
Inner Join EmployeesT on emp.EmployeeNumber = DimP.PersonID
WHERE FullName in (@PM)

OPTION (OPTIMIZE FOR (@PM UNKNOWN))

答案 1 :(得分:0)

我的同事能够解决这个问题:她使用了`WHERE emp.empNumber =(当emp.FullName IN(@PM)时的情况)

:)