【问题标题】:Analyising Implict CAST分析隐式 CAST
【发布时间】:2012-08-16 14:50:32
【问题描述】:

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

DECLARE @date DATETIME
SET     @date = getDate()
SET     @date = DATEADD(DAY, DATEDIFF(DAY, 0, @date-3), 3)

这会将日期四舍五入到星期四。

我面临的挑战是证明存在隐式 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?
)

然而,也许03 是常量,这是在编译到执行计划期间完成的?

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


有没有一种方法可以分析执行计划或其他方法,以便能够客观地确定这一点?

为了让事情变得更复杂,我目前不在现场。我正在尝试远程协助一位同事。这意味着我无法直接访问 SSMS 等。

【问题讨论】:

  • 。 .我会诚实的。我还没有找到方法。我希望有人提供一个很好的答案。我花了很多很多时间分析产生类型转换错误(通常从字符串到日期或数字)的复杂查询。

标签: sql sql-server-2005 implicit-conversion sql-execution-plan


【解决方案1】:

查询

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

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

查询 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'))

查询 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)))

表明您的怀疑是正确的,它发生在编译时的文字值,但需要 CONVERT_IMPLICIT 在运行时用于 int 变量

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 2017-09-23
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多