【发布时间】:2012-10-09 13:20:53
【问题描述】:
我有这个问题,
Declare @Prcocessrate float
declare @item varchar(20)
declare @process varchar(20)
declare @branch varchar(20)
set @item = 'shirt'
set @process = 'kt'
set @branch = '1'
select @Prcocessrate = ProcessPrice from itemwiseprocessrate where itemname=@Item and Process=@process and branchid=@branch
当我单手运行时,执行计划只显示3个步骤,你自己看看..
但我有这个procedure sp_newBooking
ALTER PROC sp_newbooking
-- other arguements--
AS
BEGIN
--OTHER FLAGS--
ELSE IF (@Flag = 32)
BEGIN
declare @ItemId varchar(max),@ProcessRate float
--set @BranchId='1'
select @ProcessCode = DefaultProcessCode from mstconfigsettings where branchid=@BranchId
select @ItemId= DefaultItemId from mstconfigsettings where branchid=@BranchId
select @ItemName= ItemName from itemmaster where itemid=@ItemId and branchid=@BranchId
select @ProcessRate = ProcessPrice from itemwiseprocessrate where itemname=@ItemName and ProcessCode=@ProcessCode and branchid=@BranchId
if(@ProcessRate is not null)
select @ItemName as ItemName,@ProcessCode as ProcessCode,@ProcessRate as ProcessRate
else
select @ItemName as ItemName,@ProcessCode as ProcessCode,'0' as ProcessRate
END
-- OTHER FLAGS --
END
现在!,当我运行它时
exec sp_newbooking
@flag = 32,
@Branchid = 1
执行计划显示 6 个步骤! 这是图片..!
查看查询 4
为什么从过程中执行同一个查询需要6个步骤,而单独执行却需要3个步骤?这是什么鬼?
【问题讨论】:
-
可能是隐式转换。第二个计划中的计算标量在做什么? (在属性窗口中查看)。存储过程参数的数据类型是否与第一个查询中的变量相同?
-
我认为@MartinSmith 是正确的。当您在 proc 之外运行查询时,您正在为 @branch 使用值为“1”的 varchar(20) 类型。当您调用 proc 时,您指定 @branchid = 1。在 1 周围看不到引号。 SQL Server 在调用 sp 时将值 1(一个 int)转换为 varchar。我怀疑如果您将您的 SP 称为
EXEC sp_newbooking @flag=32, @branchID='1',您将获得相同的执行计划。
标签: sql tsql query-optimization sql-execution-plan