[英]issue on with CTE in stored procedure
我有一個這樣的存儲過程:
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
。 我已經把分號了。 但這是行不通的。
WITH
需要緊隨其后的是SELECT
(或UPDATE
或DELETE
或INSERT
),而不是SET
,並且以下語句應引用至少一個定義的公用表表達式。 您不要在SELECT
跟隨WITH
(或UPDATE
或DELETE
或INSERT
)。
此外,動態sql的范圍將無法識別由執行查詢字符串之前的過程形成的公用表表達式(cte)。
指定一個臨時的命名結果集,稱為公用表表達式(CTE)。 這是從一個簡單的查詢派生的,並在單個SELECT,INSERT,UPDATE或DELETE語句的執行范圍內定義。 此子句也可以在CREATE VIEW語句中用作其定義SELECT語句的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.