在这里找到了几个类似的问题,但无法弄清楚如何应用于我的场景.
我的函数有一个名为@IncludeBelow的参数.值为0或1(BIT).
我有这个问题:
SELECT p.*
FROM Locations l
INNER JOIN Posts p
on l.LocationId = p.LocationId
WHERE l.Condition1 = @Value1
AND l.SomeOtherCondition = @SomeOtherValue
Run Code Online (Sandbox Code Playgroud)
如果@IncludeBelow为0,我需要查询为:
SELECT p.*
FROM Locations l
INNER JOIN Posts p
on l.LocationId = p.LocationId
WHERE l.Condition1 = @Value1
AND l.SomeOtherCondition = @SomeOtherValue
AND p.LocationType = @LocationType -- additional filter to only include level.
Run Code Online (Sandbox Code Playgroud)
如果@IncludeBelow为1,则需要排除最后一行.(即不要应用过滤器).
我猜它需要是一个CASE声明,但无法弄清楚语法.
这是我尝试过的:
SELECT p.*
FROM Locations l
INNER JOIN Posts p
on l.LocationId = p.LocationId
WHERE l.Condition1 = …Run Code Online (Sandbox Code Playgroud) 在SQL Server 2005数据库中,我正在处理此查询:
select*
from foo
join bar on bar.x = foo.x
join baz on baz.y = foo.y
where foo.x = 1000
与以下参数化版本相比,它具有非常不同且更快的查询计划.
声明@p0 int
set @ p0 = 1000
select*
from foo
join bar on bar.x = foo.x
join baz on baz.y = foo.y
where foo.x = @ p0
在我的特定情况下,具有文字的版本在亚秒时间运行.参数化版本需要2-3秒.我认为它们是相同的,因为它们是相同的查询.
为什么他们会得到不同的查询计划?
有没有办法让参数化版本具有与文字版本相同的性能?
这是查询计划.我的真实查询与上面给出的通用查询有很大不同,但产生这些计划的两个查询之间的唯一区别是参数.为什么用一个参数替换一个文字会产生如此大不相同的计划?
从客户端应用程序我做了:
select * from table where Name = :Parameter
Run Code Online (Sandbox Code Playgroud)
然后在执行查询之前我做
:Parameter = 'John'
Run Code Online (Sandbox Code Playgroud)
这些参数不是搜索和替换,而是传递给服务器的实际参数.由于我需要详细测试其中的一些查询,如何在管理工作室中编写查询?
我想用参数编写查询并给参数赋值.如何才能做到这一点?
更新:
为了消除这里的混乱,我添加信息以更好地表达myseld.
当我执行正常查询时,我在sql server profiler中看到
select * from table where Name = 'John'
Run Code Online (Sandbox Code Playgroud)
当我执行参数化查询时,我看到:
exec sp_executesql N'select * from table
where Name = @P1',N'@P1 varchar(8000)','John'
Run Code Online (Sandbox Code Playgroud)
这就是我说它不是搜索和替换的原因.