分析隐含的CAST

Mat*_*lie 5 sql sql-server-2005 implicit-conversion sql-execution-plan

我有一个学术场景,我想知道如何分析.

DECLARE @date DATETIME
SET     @date = getDate()
SET     @date = DATEADD(DAY, DATEDIFF(DAY, 0, @date-3), 3)
Run Code Online (Sandbox Code Playgroud)

这将把日期缩短到星期四.

我所面临的挑战是证明存在隐式 CAST的地方.

有三个地方,我认为这必须发生......

DATEADD(
  DAY,
  DATEDIFF(
    DAY,
    0,          -- Implicitly CAST to a DATETIME?
    @date-3     -- I presume the `3` is being implicitly cast to a DATETIME?
  ),
  3             -- Another implicit CAST to a DATETIME?
)
Run Code Online (Sandbox Code Playgroud)

但是,也许,因为0和3是常量,这是在编译执行计划期间完成的吗?

但如果3是INT变量,会有所不同吗?


有没有办法分析执行计划或其他方法,以便能够不确定地确定这个?

为了使问题更复杂,我现在不在现场.我正试图远程协助同事.这意味着我无法直接访问SSMS等.

Mar*_*ith 7

对于查询

DECLARE @date DATETIME  = getDate()
DECLARE @N INT = 3

SELECT  DATEADD(DAY, DATEDIFF(DAY, 0, @date-3), 3)
FROM master..spt_values

SELECT  DATEADD(DAY, DATEDIFF(DAY, 0, @date-@N), @N)
FROM master..spt_values
Run Code Online (Sandbox Code Playgroud)

查看执行计划,计算标量显示以下内容.

查询1

[Expr1003] = Scalar Operator(dateadd(day,datediff(day,'1900-01-01 00:00:00.000',[@date]-'1900-01-04 00:00:00.000'),'1900-01-04 00:00:00.000'))
Run Code Online (Sandbox Code Playgroud)

查询2

[Expr1003] = Scalar Operator(dateadd(day,datediff(day,'1900-01-01 00:00:00.000',[@date]-CONVERT_IMPLICIT(datetime,[@N],0)),CONVERT_IMPLICIT(datetime,[@N],0)))
Run Code Online (Sandbox Code Playgroud)

显示您的怀疑是正确的,它在文本值的编译时发生,但CONVERT_IMPLICIT在运行时需要int变量