Вызов пользовательской функции внутри CTE для каждой строки, возвращаемой из другого CTE - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть запрос с CTE, который возвращает несколько строк, я хочу выполнить функцию для каждой возвращаемой строки.Возможно ли, я проверил на Google, он говорит об использовании временной таблицы для заполнения результата.Я просто хочу подтвердить

with job_list as (  select JOB_ID,CREATED_DATE from job_table)  ,
app_list as (select APP_ID from job_list jobs, dbo.fnGetApp(jobs.JOB_ID,9))
select * from job_list, app_list 

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

dbo.fnGetApp - это функция, которая принимает два параметра varchar и intи возвращает таблицу из одного столбца (varchar APP_ID)

Ошибка - не удалось связать идентификатор из нескольких частей "jobs.JOB_ID".

Я хочузапустить функцию для каждой строки, возвращаемой job_list CTE, и использовать результаты в качестве CTE для другого запроса, который использует оба CTEs

Спасибо Дэвид

Ответы [ 2 ]

5 голосов
/ 03 апреля 2012

Разве вы не можете сделать это так:

with job_list as 
(  
   select 
     JOB_ID,
     CREATED_DATE 
   from 
     job_table
),
app_list as 
(
   select 
      APP_ID 
   from 
     job_list AS jobs 
     CROSS APPLY dbo.fnGetApp(jobs.JOB_ID,9) AS something
)
select * from 
job_list, 
app_list
0 голосов
/ 03 апреля 2012

Если вы хотите вызвать метод, то вам нужно использовать курсор, но если вы хотите вызвать функцию, то вы сможете достичь этого с помощью объединений. Возможно, я что-то упустил, но я не совсем уверен, почему вы чувствуете, что вам нужно встроить в этот код подвыбор. CTE создает эквивалент временной таблицы, и все поля доступны для последующего запроса, поэтому просто обратитесь к этим полям в вашей внутренней функции.

Возможно, если вы разместили реальный запрос, который вы используете, он может иметь больше смысла:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...