Как установить значение локальной переменной, равное результату таблицы CTE? - PullRequest
0 голосов
/ 31 января 2019

У меня есть вопрос. У нас есть таблица HR, подобная этой

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

Поэтому я хочу извлечь файл DISTINCT emp.manager, затем выбрать их по строке и передать их в переменную предположим, что 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

Ответы [ 3 ]

0 голосов
/ 31 января 2019
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
0 голосов
/ 31 января 2019

Если вы хотите получить другое имя менеджера, вам не нужно CTE.

Вы пытаетесь вставить несколько значений в VARCHAR тип данных

DECLARE @mgrname VARCHAR(20)

Вместо создания переменной VARCHAR, вы должны создать переменную типа TABLE, которая может содержать несколько значений, как показано ниже.

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
0 голосов
/ 31 января 2019
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

Вместо этого вы можете создать временную таблицу и использовать ее для ссылки, пока сеанс не станет активным.

...