【问题标题】:how to assign cte value to variable如何将 cte 值分配给变量
【发布时间】:2021-09-17 07:08:01
【问题描述】:
;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


    【解决方案1】:

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

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

    在这种情况下,SELECT 列表中的所有字段都应该分配给一个变量!

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

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

    以上选项不能混用。

    此外,CTE 是在单个 SELECTINSERTUPDATEDELETE 语句的执行范围内定义的。 (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'
    

    【讨论】:

      【解决方案2】:

      用这个替换你的最后一行:

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

      【讨论】:

        【解决方案3】:
        ;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'
        

        【讨论】:

          【解决方案4】:

          声明@a int 设置@A = 1234 ; 与 CTE 作为(选择 科尔1, col2 来自xyz

          哪里 Col1 = @A), dt 作为(选择 @A Col1)

          选择 * 从 dt d 左连接 CTE vd ON vd.col1 = d.col1

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-03-10
            • 2014-03-04
            • 1970-01-01
            • 1970-01-01
            • 2020-10-15
            • 2017-08-12
            相关资源
            最近更新 更多