Заполнить таблицу темп. CTE Resut?

У меня есть 2 CTE, которые они оба выбирают для меня несколько записей. один из них - X, а другой - Y. с другой стороны, у меня есть 2 временные таблицы с тем же именем, что и CTE. Я хочу заполнить эту временную таблицу результатом CTE. и, в конце концов, я хочу показать эту временную таблицу в одном результате. Моя проблема в том, что я могу использовать источник данных CTE только один раз, вот мой код

        use fidilio
;WITH Fidili_CTE1X ( FirstName,LastName,SubscribedDate, RegisteredDate, pers)
AS
(
SELECT 
FirstName,LastName,SubscribedDate, RegisteredDate,dbo.GetShDate(RegisteredDate) as pers
FROM ClubProfile CP 
WHERE CP.CardNumber IS NOT NULL
AND IsExpired =0
)

SELECT LastName,pers FROM Fidili_CTE1X
  CREATE TABLE #TEMPX
 (
      Lastname nvarchar(max) ,pers varchar(10)
 )
 Insert into #TEMPX 
 select * from Fidili_CTE1X
 ;WITH FIDILIO_CTE2Y(irstName,LastName,SubscribedDate, RegisteredDate,PERS)
 AS
 (
   SELECT 
FirstName,LastName,SubscribedDate, RegisteredDate,dbo.GetShDate(RegisteredDate) as pers
FROM ClubProfile CP 
WHERE CP.CardNumber IS NOT NULL
)


SELECT  LASTNAME,PERS FROM FIDILIO_CTE2Y

CREATE TABLE #TEMPY
(
Lastname nvarchar(max) ,pers varchar(10)
)
Insert into #TEMPY
select * from FIDILIO_CTE2Y

person salar    schedule 15.01.2015    source источник
comment
если вы видите мой код, я использовал этот метод, но проблема в том, что он не распознает мой источник данных cte   -  person salar    schedule 15.01.2015
comment
Не могли бы вы исправить мой код?   -  person salar    schedule 15.01.2015
comment
CTE по своей природе могут использоваться только один раз и только сразу после их объявления. В вашем коде вы объявляете свой CTE fideli_cte1x, затем вы создаете временную таблицу и ТОГДА пытаетесь получить к ней доступ. Сначала создайте свою временную таблицу, затем объявите свой CTE и немедленно используйте его для вставки. Если вы хотите использовать один и тот же CTE дважды, вам нужно либо объявить его дважды, либо сохранить содержимое CTE во что-то вроде временной таблицы или табличной переменной, чтобы вы могли повторно обращаться к ним.   -  person Xedni    schedule 15.01.2015
comment
Я не могу исправить ваш код, потому что не могу точно сказать, что вы хотите. Единственное различие между запросами состоит в том, что один фильтрует IsExpired = 0. Вы хотите, чтобы все пользователи с не истекшим сроком действия отображались в результатах запроса дважды? Кроме того, какой смысл иметь зарегистрированную дату (не говоря уже о зарегистрированной дате, отформатированной неэффективной скалярной определяемой пользователем функцией) в CTE, если вы фактически никогда не используете эти столбцы?   -  person Aaron Bertrand    schedule 15.01.2015
comment
Лучше не указывать свое имя в БД :) Fidilio man   -  person sqluser    schedule 16.01.2015


Ответы (2)


Использовать это

use fidilio
;WITH Fidili_CTE1X ( FirstName,LastName,SubscribedDate, RegisteredDate, pers)
AS
(
SELECT 
FirstName,LastName,SubscribedDate, RegisteredDate,dbo.GetShDate(RegisteredDate) as pers
FROM ClubProfile CP 
WHERE CP.CardNumber IS NOT NULL
AND IsExpired =0
)

SELECT LastName,pers  into #TEMPX  FROM Fidili_CTE1X

 ;WITH FIDILIO_CTE2Y(irstName,LastName,SubscribedDate, RegisteredDate,PERS)
 AS
 (
   SELECT 
FirstName,LastName,SubscribedDate, RegisteredDate,dbo.GetShDate(RegisteredDate) as pers
FROM ClubProfile CP 
WHERE CP.CardNumber IS NOT NULL
)
SELECT  LASTNAME,PERS  into #TEMPY FROM FIDILIO_CTE2Y

select * from FIDILIO_CTE2Y
person Mohammed    schedule 15.01.2015
comment
Шутки в сторону? Вы просто хотели, чтобы кто-то делал за вас вашу работу? Этот код паршивый. ЕЩЕ полон ошибок. Он создает временную таблицу с некоторыми данными в ней, но затем, в конце, он ВЫБИРАЕТ некоторые ДРУГИЕ данные? - person Jasmine; 15.01.2015

Я думаю, ваше недоразумение состоит в том, что CTE не ВЫБИРАЮТ никаких данных. Они создают стол. Вы должны взаимодействовать с этой таблицей так же, как и с любой другой таблицей.

Однако ваш сценарий намного сложнее, чем должен быть. В чем будет проблема?

SELECT FirstName,LastName,SubscribedDate, RegisteredDate,dbo.GetShDate(RegisteredDate) as pers
INTO #TEMPY
FROM ClubProfile CP 
WHERE CP.CardNumber IS NOT NULL

Это дает тот же результат, что и ваш скрипт, за исключением того, что я не могу сказать, какие столбцы вам действительно нужны, из-за ошибок в скрипте.

person Jasmine    schedule 15.01.2015
comment
Только вот этот ответ неверен. Так оно и есть на самом деле. Невозможно сказать, что вы действительно хотите в выводе, потому что вы не описали это на английском или на языке SQL. Приведенный выше ответ загружает данные во временную таблицу, но выводит другие данные откуда-то еще. Это не может быть тем, что вы хотите - вы создаете временные данные и НЕ ИСПОЛЬЗУЕТЕ их ?! - person Jasmine; 16.01.2015