如何将cte值赋给变量

taj*_*taj 6 sql-server-2008

;with CTEima(PersonId,IsEmployeeActive)
as
(select count(*)
 from   custom.viwSSAppsEmpMasterExtended vem
 where  vem.SupervisorPersonId = @p_PersonId

 union all

 select CTEima.IsEmployeeActive
 from   Custom.viwSSAppsEmpMasterExtended vem
 join   CTEima on CTEima.PersonId = vem.SupervisorPersonId
 )
set @v_IsManager = (select count(*)from CTEima where IsEmployeeActive = 'Y') 
Run Code Online (Sandbox Code Playgroud)

在这里我收到关键字'set'附近的错误语法错误

告诉我如何将CTE中的值设置为变量

Pre*_*red 11

您无法SETSELECT语句中使用关键字设置值.您可以将查询中的字段分配给语句中的变量SELECT:

WITH CTE AS (
  /** .. Your Query Here .. **/
)
SELECT
  @YourVariable = FieldNameOrSubquery -- In short: Expression
FROM
  CTE
Run Code Online (Sandbox Code Playgroud)

在这种情况下,SELECT列表中的所有文件都应该分配给变量!

或者,您可以通过关键字将单个行 - 单列 SELECT语句的结果分配给变量SET:

SET @YourVariable = (SELECT COUNT(1) FROM YourTable).
Run Code Online (Sandbox Code Playgroud)

你不能混合上面的选项.

此外,CTE是单个的执行范围内定义的SELECT,INSERT,UPDATE,或DELETE语句.(http://msdn.microsoft.com/en-us/library/ms175972.aspx).SET不是SELECT/ INSERT/ UPDATE/ DELETE语句,这就是SQL Server报告语法错误的原因(CTE不能在SET语句的范围内定义.)

您的示例查询的解决方案

;WITH CTEima(PersonId,IsEmployeeActive) AS
( SELECT COUNT(*)
  FROM   custom.viwSSAppsEmpMasterExtended vem
  WHERE  vem.SupervisorPersonId = @p_PersonId

  UNION ALL

  SELECT CTEima.IsEmployeeActive
  FROM   Custom.viwSSAppsEmpMasterExtended vem
  JOIN   CTEima on CTEima.PersonId = vem.SupervisorPersonId
)
SELECT @v_IsManager = COUNT(*)
FROM CTEima
WHERE IsEmployeeActive = 'Y'
Run Code Online (Sandbox Code Playgroud)