создание временной таблицы из выражения CTE "with table as" - PullRequest
0 голосов
/ 25 апреля 2018

Мне не удается получить доступ к временной таблице на основе результатов выражения CTE.

как создать временную таблицу и получить доступ к временной переменной, объявленной в CTE.

в приведенном ниже примере последняя строка выдаст ошибку.

Спасибо

 DECLARE @tbl TABLE
  ( 
   Id int
  ,ParentId int
  )
INSERT  INTO @tbl
        ( Id, ParentId )
select t_package.package_id, t_package.parent_ID from t_package 
;
WITH  abcd
        AS (
              -- anchor
            SELECT   id
                    ,ParentID
                    ,CAST(id AS VARCHAR(100)) AS [Path]
                    ,0 as depth
            FROM    @tbl
            WHERE   ParentId = 0
            UNION ALL
              --recursive member
            SELECT  t.id
                   ,t.ParentID
                   ,CAST(a.[Path] + ',' + CAST( t.ID AS VARCHAR(100)) AS varchar(100)) AS [Path]
                   ,a.depth +1
            FROM    @tbl AS t
                    JOIN abcd AS a ON t.ParentId = a.id
           )
SELECT * from abcd;

insert into #TMP (id,parent,branch,depth) (select * from abcd)

Ответы [ 3 ]

0 голосов
/ 25 апреля 2018

Вы можете использовать 2 оператора CTE один за другим, CTE запустится сразу после объявления.См. Правило CTE

Поэтому удалите SELECT * from abcd; перед этим insert into #TMP (id,parent,branch,depth) (select * from abcd).

Для рекурсивного CTE: Когда использовать общее выражение таблицы (CTE)

0 голосов
/ 25 апреля 2018

Поскольку CTE не сохраняется, вы можете использовать его только один раз, например,

WITH cte(id) AS 
(
SELECT 1
)

SELECT * FROM cte;

SELECT * FROM cte;

Возвращает результаты '1' для первого вызова, но затем ошибка с

Сообщение 208, Уровень 16, Состояние 1, Строка 8 Неверное имя объекта 'cte'.

на втором.

Вам необходимо удалить

SELECT * from abcd;

перед заполнением вашей временной таблицы или если вам нужно вызвать ее дважды, используйте постоянный метод (временная таблица, переменная таблицы и т. Д.)

0 голосов
/ 25 апреля 2018

Набор CTE, введенный предложением WITH, действителен для единственного оператора , который следует за последним определением CTE.Здесь, похоже, вам следует просто пропустить SELECT и сделать INSERT следующее утверждение:

WITH  abcd
        AS (
              -- anchor
            SELECT   id
                    ,ParentID
                    ,CAST(id AS VARCHAR(100)) AS [Path]
                    ,0 as depth
            FROM    @tbl
            WHERE   ParentId = 0
            UNION ALL
              --recursive member
            SELECT  t.id
                   ,t.ParentID
                   ,CAST(a.[Path] + ',' + CAST( t.ID AS VARCHAR(100)) AS varchar(100)) AS [Path]
                   ,a.depth +1
            FROM    @tbl AS t
                    JOIN abcd AS a ON t.ParentId = a.id
           )
insert into #TMP (id,parent,branch,depth) select * from abcd

select * from #TMP

(я добавил select из #TMP, чтобы мы все еще получалинабор результатов возвращается клиенту, хотя операторы insert и select теперь обращены).

...