изменение хранимой процедуры для включения результатов другой хранимой процедуры / запроса - PullRequest
0 голосов
/ 07 апреля 2011

У меня есть эта хранимая процедура, которая возвращает список данных клиентов с учетом параметров

PROCEDURE [dbo].[vExport_GetClientDetailsBySchemeAndTeam]
            @startdate DATETIME = null,
            @enddate DATETIME = NULL,
            @scheme INT,
            @teamID INT
 AS
/*returns a  list of current client details between two dates */


SELECT 
    Forename,
    Surname,
    Address1,
    Address2,
    Town,
    County,
    Postcode,
    [Status],
    Telephone,
    EmergencyTelephone
    --exec vExport_GetClientDetailsBySchemeAndTeam '2010-04-06 12:00:00', '2011-04-06 12:00:00', '3', '152'
FROM
    vClients
WHERE
    vClients.ClientID in
        (SELECT DISTINCT
            E.ClientID 
            FROM vEvents E
            INNER JOIN vClients C on E.ClientID = C.ClientID
            WHERE E.EventDate between @startdate and @enddate
            --AND C.Status = 0
            AND e.SchemeID=@scheme
            AND e.TeamID = @teamID)

Однако теперь мне нужно включить в select (last eventdate) результат другого SP.что по сути выглядит следующим образом:

SELECT TOP 1 * from vEvents  E where E.ClientID =  @ClientID
order by e.EventDate desc

Как я могу вернуть эту последнюю дату события для всех клиентов в первом операторе выбора, используя второй запрос?

Stuck !!

Ответы [ 5 ]

1 голос
/ 07 апреля 2011
PROCEDURE [dbo].[vExport_GetClientDetailsBySchemeAndTeam]
            @startdate DATETIME = null,
            @enddate DATETIME = NULL,
            @scheme INT,
            @teamID INT
 AS
/*returns a  list of current client details between two dates */


SELECT 
    Forename,
    Surname,
    Address1,
    Address2,
    Town,
    County,
    Postcode,
    [Status],
    Telephone,
    EmergencyTelephone,
    (SELECT top 1 e.EventDate from vEvents  E where E.ClientID =  vClients.ClientID order by e.EventDate desc)
    --exec vExport_GetClientDetailsBySchemeAndTeam '2010-04-06 12:00:00', '2011-04-06 12:00:00', '3', '152'
FROM
    vClients
WHERE
    vClients.ClientID in
        (SELECT DISTINCT
            E.ClientID 
            FROM vEvents E
            INNER JOIN vClients C on E.ClientID = C.ClientID
            WHERE E.EventDate between @startdate and @enddate
            --AND C.Status = 0
            AND e.SchemeID=@scheme
            AND e.TeamID = @teamID)
0 голосов
/ 07 апреля 2011

Я вижу два решения:

  1. использование табличных функций вместо процедур (доступно с SQL Server 2005)

    или

  2. использовать временную таблицу, используя переменную Table (DECLARE @temp TABLE (...)), которая имеет ту же структуру, что и результат другой хранимой процедуры. Затем используйте инструкцию INSERT + EXECUTE, чтобы сохранить результат другой хранимой процедуры во временной таблице.
    INSERT @temp EXECUTE OtherStoredProc
    тогда у вас есть результат другого сохраненного процесса в таблице @ temp
0 голосов
/ 07 апреля 2011

Объедините это до объединения с производной таблицей:

SELECT 
    Forename,
    Surname,
    Address1,
    Address2,
    Town,
    County,
    Postcode,
    [Status],
    Telephone,
    EmergencyTelephone,
    E.MostRecentEventDate
FROM
    vClients C INNER JOIN (
        SELECT
            ClientID,
            MAX(EventDate) AS [MostRecentEventDate]
        FROM vEvents
        WHERE EventDate BETWEEN @startdate AND @enddate
            AND SchemeID=@scheme
            AND TeamID = @teamID
        GROUP BY ClientID
    ) E ON C.ClientID = E.ClientID

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

0 голосов
/ 07 апреля 2011

Это ваш друг:

create table #sp_output
(
  col_1 ... ,
  ...
  col_n ... ,
)

INSERT #sp_output EXECUTE <your-stored-procedure-of-choice>

Предупреждение: хранимая процедура должна возвращать один набор результатов, а схема таблицы должна точно соответствовать этому набору результатов.Таким образом, если вызываемая хранимая процедура изменяется, ваша хранимая процедура нарушается до тех пор, пока определение таблицы не будет обновлено для соответствия.

0 голосов
/ 07 апреля 2011

Дословный ответ на ваш вопрос - создать глобальную временную таблицу и заполнить ее пошагово.

Например:

    PROCEDURE [dbo].[vExport_GetClientDetailsBySchemeAndTeam] @startdate DATETIME = null, @enddate DATETIME = NULL, @scheme INT, @teamID INT AS /*returns a list of current client details between two dates */
    create table ##results(//columns you want to return)
insert into ##results (columns)

    SELECT Forename, Surname, Address1, Address2, Town, County, Postcode, [Status], Telephone, EmergencyTelephone --exec vExport_GetClientDetailsBySchemeAndTeam '2010-04-06 12:00:00', '2011-04-06 12:00:00', '3', '152' FROM vClients WHERE vClients.ClientID in (SELECT DISTINCT E.ClientID FROM vEvents E INNER JOIN vClients C on E.ClientID = C.ClientID WHERE E.EventDate between @startdate and @enddate --AND C.Status = 0 AND e.SchemeID=@scheme AND e.TeamID = @teamID)

update results
set (columns from you events table)
from ##results r, 
vEvents e
where e.clientid = r.clientid

select * from ##results

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

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