存储过程中存在相同的代码错误,适用于T-SQL



我有一个存储过程,它调用链接服务器,如下所示。列"datestr"的类型为char(8(,并且格式不总是正确的。它通常是yyyymmdd,但由于我不控制数据的格式,我使用TRY_CAST只获取可以将其格式化为日期的行。

执行SP会出现以下错误:

消息242,级别16,状态3,第1行将varchar数据类型转换为datetime数据类型导致值超出范围。

在T-SQL中运行从SP提取的完全相同的代码,返回的数据不会出错。我确信问题出在带有DATEADD函数的WHERE子句的部分,它碰到了一个无法CAST到日期的值,但我不明白为什么它在SP和提取的t-SQL中运行不同。

在运行两者之前,我使用SET SHOWPLAN_ALL ON检查了计划,并看到了一些变化。也就是说,工作查询中的估计行在远程查询操作员中要低得多(约200K,而不是1500万(

CREATE Procedure [dbo].[SampleSP]
AS
SELECT top 50 tbl1.rowID as rowID, 
year(datestr) as [year],
month(datestr) as [month],
count(*) AS CountRow
FROM   [LinkedSer].[RemoteDB].[dbo].[tbl1] tbl1
inner join [dbo].[LocalTbl] tbl2 on tbl1.rowID = tbl2.rowID
WHERE  tbl1.row_type = 'tbl1A' 
and (TRY_CAST(tbl1.datestr AS date) IS NOT NULL 
and tbl1.datestr > DATEADD(yy, -10, getdate()))
group BY tbl1.rowID, year(tbl1.datestr), month(tbl1.datestr)

谓词的求值顺序取决于计划。因此,您需要从代码中消除可能无效的比较。

并简化为:

and TRY_CAST(tbl1.datestr AS date) > DATEADD(yy, -10, getdate())

应该做到这一点。

相关内容

最新更新