【问题标题】:SQL WITH in WITHSQL WITH 中的 WITH
【发布时间】:2013-04-09 09:17:41
【问题描述】:

我想用 SQL 写一个 with in 查询。

出现一些错误。请帮忙:

DECLARE @Start AS DATETIME;
DECLARE @End AS DATETIME;
SET @Start = '2013-04-09';
SET @End = '2013-04-11';
with View_Solidnet_Training as 
(
with View_Solidnet_Training as
(
select  cast(@Start as datetime) DateValue
union all
select DateValue + 1
from View_Solidnet_Training
where DateValue + 1 <= cast(@End as datetime)
)
insert into OBJ_Availability  
select 34, DateValue, 'AM', 2, 'Test' from View_Solidnet_Training;
)
select * from View_Solidnet_Training where PK_Training_ID is not null;

错误:

消息 156,第 15 级,状态 1,第 7 行
关键字“with”附近的语法不正确。
消息 319,第 15 级,状态 1,第 7 行
关键字“with”附近的语法不正确。如果此语句是公用表表达式或 xmlnamespaces 子句,则前面的语句必须以分号结束。
消息 102,第 15 级,状态 1,第 17 行
')' 附近的语法不正确。

【问题讨论】:

  • 你到底想做什么?!?!?您不能在 CTE 中包含 DECLARE 和 SET,并且您不能将 CTE 插入到另一个表中。请用简单的英语解释您要做什么.....
  • Marc 是对的 - 您的示例查询有太多错误,我们无法看到您想要实现的目标。也许如果你解释一下你的表结构以及你想从中得到什么,那会有所帮助。
  • 我已经改变了一点。但我必须将数据从视图插入到表中。中间的“With”完美。它在表中插入行。但在 SSIS 中,此解决方案仅适用于视图中的一行。所以我需要创建另一个循环来检查视图的 ID 是否不为零,它必须声明新日期并插入视图的下一行。
  • 您不能使用 CTE 嵌套两个操作 - 您需要第一个 CTE 来组合数据,然后执行 INSERT INTO OBJ_Availability SELECT (columns) FROM CTE1,然后您需要创建第二个单独的(不是 嵌套!)CTE 再次选择数据。
  • CTE looping query 的可能重复项

标签: sql sql-server loops with-statement


【解决方案1】:

试试这个。这只是示例代码。 在这段代码中,写的是CTE with CTE。

;with CTE1 as (
SELECT Patientid
,Lastname1
,age
,dob
,ROW_NUMBER() OVER (ORDER BY Patientid DESC) AS RowNumber
FROM PTN_PATIENT    
)
,CTE2 AS (
SELECT CTE1.Patientid
,CTE1.Lastname1
,CTE1.age
,CTE1.dob
,CTE1.RowNumber
,DATEDIFF(YEAR,CTE1.dob,GETDATE()) as yearOfservce
FROM Lab_LabDiagOrder INNER JOIN CTE1
ON Lab_LabDiagOrder.Patientid = CTE1.Patientid
WHERE CTE1.RowNumber between 1 and 5
)
SELECT * FROM CTE2;

【讨论】:

    【解决方案2】:

    您不能在 CTE(公用表表达式)中包含 DECLARE 和 SET。

    DECLARE @Start AS DATETIME;
    DECLARE @End AS DATETIME;
    SET @Start = '2013-04-09';
    SET @End = '2013-04-11';
    
    ;WITH View_Solidnet_Training AS
    (
        SELECT @Start AS DateValue
    
        UNION ALL
    
        SELECT DateValue + 1
        FROM View_Solidnet_Training
        WHERE DateValue + 1 <= @End 
    )
    SELECT
        34, DateValue, 'AM', 2, 'Test' 
    FROM 
        View_Solidnet_Training
    -- WHERE 
    --    PK_Training_ID IS NOT NULL
    

    我不知道 PK_Training_ID 应该来自哪里 - 在您的代码中找不到它.....

    注意事项:

    • 您不能在 CTE 中包含 DECLARE 和 SET - 只有 SELECT 和 UNION ALL
    • @Start 和 @End 已经声明为 DATETIME - 再次将它们转换为 DATETIME 绝对没有意义....
    • CTE 中的值可在 CTE 之后立即用于一个 T-SQL 语句

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 2011-08-18
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      相关资源
      最近更新 更多