如何将cte值赋给变量

问题描述 投票:0回答:4
;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') 

这里我遇到了类似的错误 关键字“set”附近的语法不正确

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

sql sql-server tsql sql-server-2008 common-table-expression
4个回答
23
投票

您不能在

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

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

在这种情况下,

SELECT
列表中的所有字段都应该分配给一个变量!

或者您可以通过 SELECT 关键字将

单行单列
SET
语句的结果分配给变量:

SET @YourVariable = (SELECT COUNT(1) FROM YourTable).

您不能混合使用以上选项。

此外,CTE 是在单个

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

示例查询的解决方案

;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'

3
投票

将最后一行替换为:

select @v_IsManager = count(*) from CTEima where IsEmployeeActive = 'Y'

0
投票
;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'

0
投票
DECLARE @a int
SET @A = 1234
;
WITH CTE
AS (SELECT
  Col1,
  col2
FROM xyz

WHERE Col1 = @A),
dt
AS (SELECT
  @A Col1)

SELECT
  *
FROM dt d
LEFT JOIN CTE vd
  ON vd.col1 = d.col1
© www.soinside.com 2019 - 2024. All rights reserved.