我有一个包含这些行的存储过程
DECLARE @newTimestamp datetime = CURRENT_TIMESTAMP
UPDATE dbo.Accounts
SET Modified = @newTimestamp
但是,在 Accounts DB 中,我们有这个
[Modified] DATETIME2 (7) NOT NULL,
然后每当我们进行比较(特别是平等)时,我们都没有得到想要的答案。我们已经通过将兼容性级别设置得足够低(110)来解决这个问题,但是有没有简单的方法可以找到我们的存储过程与表中的数据类型不匹配的任何实例?
我宁愿不必编写解析器,但似乎如果必须,我会遍历每个表定义并记录列类型,然后找到每列的每次使用并尝试确定它是否被设置或与声明为不同类型的变量相比。
是否有任何工具已经可以做到这一点,或者系统视图或日志中的某处是否存在投诉?
我发现 Brent Ozar 的 sp_blitzcache 可能会在查询计划中找到它,但不能保证缓存将具有给定数据库的每个实例;我认为我对代码的静态分析而不是实时查看正在运行的 SQL 服务器感觉更舒服。我可以访问(许多)数据库的实时副本,以及 Visual Studio 中 SQL 解决方案的源代码。
编辑 - 与我的问题无关,但我可以提供背景。当我们有一个日期时间时,它在小数点后有 3 位精度。当我们有一个 datetime2 时,它有 7 位精度。如果您采用单个时间戳,并尝试比较同一时刻的 datetime 和 datetime2,它们将不相等。
如果我们将兼容性级别固定为 110,它会忽略 datetime2 的额外准确性,这是我们当前的行为。
您可以使用 DMV 查看查询计划缓存,并在计划的 XML 上使用 XQuery 过滤隐式转换
您可以对 Query Store 执行相同的操作,这将在服务重新启动之间保留计划。