sql - 使用变量时 SELECT 挂起

标签 sql select sql-server-2014

SQL Server 2014 (v13.0.4001.0) - 此示例脚本挂起:

DECLARE @from int = 0
DECLARE @to int = 1000

select  
    *
from 
    TaskNote dtn 
join 
    Participants tp on dtn.Task_ID = tp.TaskId
where 
    dtn.TaskNote_ID between @from and @to

但是如果我将变量更改为常量 - 那就没问题了。

像这样:

where 
    dtn.DocTaskNote_ID between 0 and 1000

另外,如果我删除连接,一切都可以。

不知道问题出在哪里

最佳答案

如果您的查询位于存储过程中,则您提到的问题的一个可能原因是参数嗅探。 SQL Server 第一次使用参数的初始值编译查询。在对该过程的后续调用中,引擎使用缓存的执行计划,这对于当前变量值可能不是最佳的。

解决此问题的一个方法是使用OPTION (RECOMPILE):

select *
from TaskNote dtn 
join Participants tp on dtn.Task_ID = tp.TaskId
where dtn.TaskNote_ID between @from and @to
option (recompile)

这样,每次使用当前参数值执行过程时都会编译查询。

进一步阅读:

关于sql - 使用变量时 SELECT 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41614592/

相关文章:

php - 在 mysql 中选择登录/注销对并计算时间跨度

sql - 我怎样才能让这个查询递归Sql Server?

mysql - 具有多个条件和顺序的复杂选择查询

sql - 将其中带单引号的字符串替换为另一个字符串 SQL

sql - Laravel Builder 中的 1 where 子句中的 2 个条件

java - 使用 Java ResultSet 选择多个列值

postgresql - SELECT 语句中的 SQL 语句 If 语句

sql - 当 IN 内没有可用记录时,使用 IN 子句选择所有记录

mysql在MSSQL中构造 "insert into ... select ... on duplicate key update"

python - 多对多关系是否等同于双重一对多关系? SqlAlchemy