【发布时间】:2016-08-10 14:08:16
【问题描述】:
我使用的是 MS SQL Server 2012。
我正在尝试创建一个以@n int 作为参数的存储过程。该过程基本上是尝试根据记录的日期早于另一个表中的某些日期,从一个表中查找需要重新计算某些信息的记录子集。
该程序必须执行以下操作:
- 从
Table1中查找记录,其中Table1.UpdatedOn是过去@n天之内的记录。 - 从
Table2中查找记录,其中Table2.EndDate是在第一个项目符号点返回的记录中的日期(所以基本上如果T2.EndDateT1SubSet.UpdatedOn,那么我们想要那个记录) - 如果
Table2.EndDate是null,那么我们使用不同的日期列进行比较。 - 将满足此条件的来自
Table2的记录插入Table3。更具体地说,它应该将Table2.RecordID以及一些“硬编码”值插入到Table3中。
这就是我所拥有的:
INSERT INTO Table3 (ColA, ColB, ColC, ColD)
SELECT RecordID, GETDATE(), 0, null
FROM Table2
WHERE EXISTS
(SELECT RecordID FROM Table2 WHERE EndDate IS NOT NULL AND EndDate < (SELECT UpdatedOn FROM Table1 WHERE UpdatedOn > DATEADD(day, @n, GETDATE())) OR
SELECT RecordID FROM Table2 WHERE EndDate IS NULL And SomeOtherDate < (SELECT UpdatedOn FROM Table1 WHERE UpdatedOn > DATEADD(day, @n, GETDATE())))
从逻辑上讲,这可能是不正确的,但是当我尝试执行该命令时,无论哪种方式,我都会收到两个错误:
第 21 行 关键字“SELECT”附近的语法不正确。
第 21 行 ')' 附近的语法不正确。
我不确定我的嵌套查询出了什么问题。
【问题讨论】:
-
匹配 ('s 和 )'s。
-
问题出现在 OR 之后。
-
对于您的未使用的日期,如果它为空,那么您的搜索参数可以是 COALESCE(EndDate , SomeOtherDate )
-
如果还不行,我们仍然可以做更多,您已经得到“从 Table1 中查找 Table1.UpdatedOn 在过去 @n 天内的记录。”没关系,但是在第二点“在第一个项目符号点返回的记录中的日期之前”,项目符号点 1 是否给出了多个日期?如果是,我们使用哪个日期,所以记录配对,或者我们会采取一些最小的集合 - 如果你问另一个问题,试着举一个只有几条记录的例子,即使是第一组中的两条记录你回来,然后解释日期是如何工作的
标签: sql sql-server