簡體   English   中英

如何同時從SQL Server存儲過程的表式函數調用teo列

[英]How can I call teo columns from a tablar function in a SQL Server stored procedure at a same time

這是我的存儲過程:

ALTER  PROCEDURE [dbo].[PaymentStatusProviderDetailView]
    (@POId INT ,
     @ProviderId INT ,
     @PrrId INT)
AS 
BEGIN
    SELECT  
        SDID,
        dbo.GetServiceDetailString(SDID) AS ServiceName,
        POID,
        AmountPaid, AmountHeld,
        ProviderName,
        (SELECT ReimbursementAmount
         FROM dbo.GetReimbursementBilledAmounts(@POId, SDID, @ProviderId, @PrrId)) AS ReimbursementAmount, 
        (SELECT ServiceMonth
         FROM dbo.GetReimbursementBilledAmounts(@POId, SDID, @ProviderId, @PrrId)) AS ServiceMonth
    FROM    
        (SELECT    
             SD.Id AS SDID, PO.Id AS POID,
             SUM(PD.PaymentAmount) AS AmountPaid,
             PH.HoldAmount AS AmountHeld,
             PROV.ContractorName AS ProviderName
         FROM      
             [dbo].[PaymentDetail] PD
         JOIN 
             PurchaseOrder PO ON PO.Id = PD.PO_Id
         JOIN 
             fBusinessUnit BU ON BU.id = PD.BU_Id
         LEFT JOIN 
             Reimbursement_EBSUtilization REU ON REU.Id = PD.REU_Id
         LEFT JOIN 
             Reimbursement_CDSUtilization RCU ON RCU.Id = PD.RCU_Id
         LEFT JOIN 
             PaymentHold PH ON PH.PO_Id = PO.Id
                            AND (PH.RCU_Id = PD.RCU_Id OR PH.REU_Id = PD.REU_Id)
         LEFT JOIN 
             ProviderReimbursementRequest PRR ON (PRR.Id = REU.PRR_Id OR PRR.Id = RCU.PRR_Id)
         LEFT JOIN 
             fContractor PROV ON PROV.Id = PRR.Contractor_Id
         LEFT JOIN 
             CDSUtilization CDS ON CDS.Id = RCU.CDSU_Id
         LEFT JOIN 
             fServiceDetail SD ON SD.Id = REU.SD_Id OR SD.Id = CDS.ServiceDetail_Id
         WHERE     
             Po.Id = @POId
             AND PRR.Contractor_Id = @ProviderId
             AND PRR.Id = @PrrId
         GROUP BY  
             SD.Id, PO.Id, PH.HoldAmount, PROV.ContractorName

         UNION

         SELECT    
             SD.Id AS SDID, PO.Id AS POID,
             NULL,
             SUM(PH.HoldAmount) AS AmountHeld,
             PROV.ContractorName AS ProviderName
         FROM      
             PurchaseOrder PO
         JOIN 
             PaymentHold PH ON PH.PO_Id = PO.Id
         LEFT JOIN 
             Reimbursement_EBSUtilization REU ON REU.Id = PH.REU_Id
         LEFT JOIN 
             Reimbursement_CDSUtilization RCU ON RCU.Id = PH.RCU_Id
         LEFT JOIN 
             CDSUtilization CDS ON CDS.Id = RCU.CDSU_Id
         JOIN 
             ProviderReimbursementRequest PRR ON PRR.Id = REU.PRR_Id OR RCU.PRR_Id = PRR.Id
         JOIN 
             fContractor PROV ON PROV.Id = PRR.Contractor_Id
         JOIN 
             fServiceDetail SD ON SD.Id = REU.SD_Id OR SD.Id = CDS.ServiceDetail_Id
         WHERE     
             Po.Id = @POId
             AND PRR.Contractor_Id = @ProviderId
             AND PRR.Id = @PrrId
             AND NOT EXISTS (SELECT 1
                             FROM PaymentDetail PD
                             WHERE PH.PO_Id = PD.PO_Id
                               AND (PH.RCU_Id = PD.RCU_Id OR PH.REU_Id = PD.REU_Id))
         GROUP BY  
             SD.Id, PO.Id, PROV.ContractorName) DT
    END

在上面的存儲過程中,在特定的代碼中,我為兩列兩次調用了相同的表格函數

 (SELECT ReimbursementAmount
  FROM dbo.GetReimbursementBilledAmounts(@POId, SDID, @ProviderId, @PrrId)) AS ReimbursementAmount,
 (SELECT ServiceMonth
  FROM dbo.GetReimbursementBilledAmounts(@POId, SDID, @ProviderId, @PrrId)) AS ServiceMonth

如何在同一存儲過程中僅調用一次以上函數並同時獲得兩個列名?

像下面這樣說

 (SELECT ReimbursementAmount, ServiceMonth
  FROM dbo.GetReimbursementBilledAmounts(@POId, SDID, @ProviderId, @PrrId)) AS ReimbursementAmount and ServiceMonth

有人可以幫我嗎?

這樣行嗎?

SELECT .......
........
RI.ReimbursementAmount,
RI.ServiceMonth,
...

FROM
.....
....
CROSS APPLY dbo.GetReimbursementBilledAmounts(@POId, SDID, @ProviderId, @PrrId) RI
     WHERE     
     Po.Id = @POId
     AND PRR.Contractor_Id = @ProviderId
     AND PRR.Id = @PrrId
....
..

這看起來像sql server中的限制。 我們應該只使用列函數來檢索或顯示單個列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM