2011-04-06 76 views
0

我有這個存儲過程返回給定PARAMS改變一個存儲過程,包括從另一個存儲過程結果/查詢

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 [email protected] 
      AND e.TeamID = @teamID) 

不過,我現在需要的選擇(最後EVENTDATE,以包括客戶的詳細信息列表)另一個SP的結果。其實質看起來像這樣:

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

如何使用第二個查詢返回第一個select語句中的所有客戶端的最後一個事件日期?

卡住!

回答

1
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 [email protected] 
      AND e.TeamID = @teamID) 
+0

非常感謝 - – amun1000 2011-04-06 21:39:00

+0

這不是「包含在選擇另一個SP的結果中」,這是「包含在選擇另一個SP的相同查詢中」。我知道Oded的結果是可以的,但它不是一回事。 – Skrol29 2011-04-06 21:45:08

+0

@ Skrol29 amun1000沒有要求在查詢中專門使用SP。 amun1000只是想包含查詢給出的SP的結果(最後一個eventdate)。如果必須使用SP,我會做得不同。 – 2011-04-06 21:56:47

-1

你的問題的文字回答是創建一個全局臨時表,並逐步填充該表。

例如:

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 [email protected] 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 

不過,我想你也可以達到你想通過加入傳統的禮物是什麼。值得看的,如果你可以從你的主查詢加入到事件表...

+0

全局臨時表中的其他存儲過程的結果,建立一個競爭狀態。除非您絕對確信只有一個過程不會使用它們,否則不要使用它們。 – 2011-04-06 21:38:51

0

這是你的朋友:

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

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

需要說明的是,存儲過程必須返回一個結果設置,並且表模式必須與該結果集完全匹配。所以如果被調用的存儲過程發生了變化,你的存​​儲過程就會中斷,直到表定義更新爲匹配。

0

結合它歸結爲一個加入反對派生表:

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 [email protected] 
      AND TeamID = @teamID 
     GROUP BY ClientID 
    ) E ON C.ClientID = E.ClientID 

使用臨時表的東西,這個簡單的將是不必要和數據庫資源,完全是浪費。

0

我看到兩個解決方案:

  1. 使用表函數,而不是程序(可從SQL Server 2005中)



  2. 使用表變量使用臨時表(DECLARE @temp TABLE( ...)),其結構與其他存儲過程的結果相同。然後使用INSERT + EXECUTE語句將其他存儲過程的結果存儲到臨時表中。
    INSERT @temp EXECUTE OtherStoredProc
    ,那麼你必須在表@temp
相關問題