sql - 如何将 cte 值分配给变量

标签 sql sql-server tsql 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') 

在这里我收到错误
关键字“set”附近的语法不正确

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

最佳答案

您不能使用 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'

关于sql - 如何将 cte 值分配给变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26908234/

相关文章:

sql - 使用交叉连接在 Postgresql 中为每个起点-终点对填充时间序列

sql - 通过 SQL 连接到 azure 会使它崩溃

截断时的 SQL 触发器

sql-server - 如何使用 LTRIM/RTRIM 搜索和替换前导/尾随空格?

mysql - 对首次发生后 N 天内的事件进行计数

sql - 在 SELECT 中嵌入 pg_advisory_lock 与显式使用另一个语句相比有什么好处?

mysql - SQL 从其他表中选择具有相应值的列

sql - SQL差异的原因

sql-server - SQL Server 优先级排序

sql-server-2008 - 尝试获取数据库 2 中的逻辑页失败。它属于分配单元 X 不属于 Y