【发布时间】:2014-02-28 17:04:21
【问题描述】:
我创建了一个非常简单的示例,显示了我在使用动态 SQL 进行更复杂的查询时遇到的问题,我无法弄清楚为什么 CTE 会导致错误,而标准版本不是。
使用 CTE 时出错:
从字符串转换日期和/或时间时转换失败。
我正在尝试通过我的动态查询实现以下目标: 标记与指定数据类型(本例中为日期)不匹配的记录。如果他们通过了该步骤,他们稍后会根据查找表进行检查,以验证它们是我期望的值(验证指定范围内的日期)。
-- Table Setup
CREATE TABLE #ValidDate
(
V INT IDENTITY (1, 1) NOT NULL,
VDate DATE NULL
)
INSERT INTO #ValidDate
VALUES ('02/20/2014'), ('02/21/2014'), ('02/22/2014'), ('02/23/2014'), ('02/25/2014')
CREATE TABLE #DatesToValidate
(
I INT IDENTITY (1, 1) NOT NULL,
IDate VARCHAR(30) NULL
)
INSERT INTO #DatesToValidate
VALUES ('apple'), ('02/21/2014'), ('orange'), ('02/23/2014')
CREATE TABLE #Errors
(
ID INT,
Dates VARCHAR(30)
)
INSERT INTO #Errors
SELECT *
FROM #DatesToValidate
WHERE ISDATE(IDate) <> 1
以下是标准查询(作品):
SELECT *
FROM #DatesToValidate
WHERE I NOT IN ( SELECT ID
FROM #Errors)
AND IDate NOT IN ( SELECT VDate
FROM #ValidDate)
以下是 CTE(不起作用):
;WITH CTE AS
(
SELECT *
FROM #DatesToValidate
WHERE I NOT IN ( SELECT ID
FROM #Errors)
)
SELECT *
FROM CTE
WHERE IDate NOT IN ( SELECT VDate
FROM #ValidDate)
【问题讨论】:
-
供将来参考 MySql 是一个与 SQL-Server 完全不同的 DBMS,不应将它们标记为相同。
-
你能提供更多关于“不工作”的细节吗?
标签: sql sql-server-2008 tsql common-table-expression