如何设置局部变量值等于 CTE table 的结果?

How to SET the local variable value equal to result from CTE table?

我有一个问题 我们有这样的 table HR

EmpName    Empmanager
Jack        Jane
Tom         Jane 
Tony        Victor
Isabella    Hugo
Anna        Victor

所以我想逐行提取 DISTINCT emp.manager 然后 select 并将它们提供给变量假设 mgrname。我在 SET @mgrname 语法中遇到错误?

DECLARE @count INT
DECLARE @mgrname VARCHAR(20)
SET @count = 3
WITH  MGRlist as(
    SELECT DISTINCT Empmanager FROM HR)
    **SET @mgrname** = SELECT Empmanager  FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY mgr ASC) AS RowNumber,
    *
    FROM MGRlist
    ) AS RESULT
    WHERE RowNumber = @count -- FIND THE CURRENT MANAGER NAME
select 'Jack'      as Empname ,  'Jane'   as empmanager
into #temp1  union all 
select 'Tom'       as Empname ,  'Jane'   as empmanager union all  
select 'Tony'      as Empname ,  'Victor' as empmanager union all 
select 'Isabella'  as Empname ,  'Hugo'   as empmanager union all 
select 'Anna'      as Empname ,  'Victor' as empmanager  


DECLARE @count INT
DECLARE @mgrname VARCHAR(20)
SET @count = 3

SELECT DISTINCT Empmanager into #temp2 FROM #temp1


set @mgrname =   (SELECT Empmanager  FROM (
SELECT ROW_NUMBER() OVER (ORDER BY empmanager ASC) AS RowNumber,
*
FROM #temp2
) AS RESULT
WHERE RowNumber = @count)  -- FIND THE CURRENT MANAGER NAME

select @mgrname as CurrentManagername

输出:

   CurrentManagername
    Victor

您可以创建一个临时 table 并使用它来引用,直到会话处于活动状态。

DECLARE @count INT
DECLARE @mgrname VARCHAR(20)
SET @count = 3
;WITH  MGRlist as(
    SELECT DISTINCT Empmanager FROM HR)
    SELECT @mgrname= Empmanager  FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY Empmanager ASC) AS RowNumber,
    *
    FROM MGRlist
    ) AS RESULT
    WHERE RowNumber = @count

如果您想在这种情况下获得不同的经理姓名,则不需要 CTE

您正在尝试在 VARCHAR 数据类型

中插入多个值
DECLARE @mgrname VARCHAR(20)

您应该创建一个 TABLE 类型的变量,而不是创建一个 VARCHAR 变量,它可以包含多个值,如下所示。

DECLARE @mgrname TABLE(ManagerName VARCHAR(100))

要获取特定数量的不同经理姓名,您可以使用

SELECT DISTINCT TOP (@count)

您的最终查询应如下所示。

DECLARE @count INT
DECLARE @mgrname table (ManagerName VARCHAR(100))
SET @count = 3

INSERT INTO @mgrname
SELECT DISTINCT TOP (@count)  Empmanager FROM HR
ORDER BY Empmanager
--Now output is stored inside a table variable.
SELECT * FROM @mgrname