在存储过程中使用CTE进行问题

问题描述 投票:0回答:1

我有一个这样的存储过程:

CREATE PROCEDURE prtl_usp_portal_logdaily 
    @startdate DATETIME,
    @enddate DATETIME,
    @usertype int,
    @gradelist varchar(1000) = null
AS
BEGIN
    DECLARE @qry NVARCHAR(MAX)
    SET @qry=''

    IF(@usertype = 1)
    BEGIN
       ;WITH mycte AS
       (
           SELECT CAST(@startdate AS DATETIME) DateValue
           UNION ALL
           SELECT DateValue + 1
           FROM mycte   
           WHERE DateValue + 1 <= @enddate
      )

      SET @qry = N'SELECT datepart(day,DateValue) AS daycode,
   (select count(DISTINCT a.userID) from PRTL_UserAccessLog a
   inner join prtlv_familydetails b
   on a.userid=b.familyid 
   INNER JOIN STD_StudentDetails c ON b.FamilyID = c.familyid
    INNER JOIN dbo.STD_CurrentAcademicInformation d ON c.StudentID = d.StudentID
   WHERE d.GradeID IN ('+@gradelist+')
   and a.usertypeid=1 and convert(date,DateTime) = DateValue) countvalue,
   (select count(*) from prtlv_familydetails) AS total_count,
   ROUND((CAST((select count(DISTINCT a.userID) from PRTL_UserAccessLog a
   inner join prtlv_familydetails b
   on a.userid=b.familyid 
   INNER JOIN STD_StudentDetails c ON b.FamilyID = c.familyid
    INNER JOIN dbo.STD_CurrentAcademicInformation d ON c.StudentID = d.StudentID
   WHERE d.GradeID IN ('+@gradelist+')
   and a.usertypeid=1 and convert(date,DateTime) = DateValue) AS FLOAT)/CAST((select count(*) from prtlv_familydetails)AS FLOAT)),3) AS average, 
   datename(dw,DateValue) AS day_name 
   FROM    mycte';
END
---
 EXEC (@qry)
 END

当我运行该过程时,我收到以下错误:

关键字“SET”附近的语法不正确。

谷歌搜索后,我发现,如果with cte is not the first statement, semicolon should be placed before cte statement。我把分号。但它没有用。

sql sql-server stored-procedures common-table-expression
1个回答
4
投票

WITH需要跟随SELECT(或UPDATEDELETEINSERT),而不是SET,并且至少有一个定义的公用表表达式应​​该由以下语句引用。你不遵循WITH(或SELECTUPDATEDELETE)的INSERT

此外,动态sql的范围将无法识别在执行查询字符串之前由过程形成的公用表表达式(cte)。

指定临时命名结果集,称为公用表表达式(CTE)。这是从简单查询派生而来,并在单个SELECT,INSERT,UPDATE或DELETE语句的执行范围内定义。此子句也可以在CREATE VIEW语句中用作其定义SELECT语句的一部分。

见:WITH common_table_expression

© www.soinside.com 2019 - 2024. All rights reserved.