我如何加入存储过程?

Mal*_*ist 45 sql sql-server-2005-express

我有一个不带参数的存储过程,它返回两个字段.存储过程汇总应用于租户的所有事务,并返回租户的余额和ID.

我想使用它返回的记录集和查询,我需要在租户的id上加入它的结果.

这是我目前的查询:

SELECT t.TenantName, t.CarPlateNumber, t.CarColor, t.Sex, t.SSNO, t.Phone, t.Memo,
        u.UnitNumber,
        p.PropertyName
FROM tblTenant t
    LEFT JOIN tblRentalUnit u
    ON t.UnitID = u.ID

    LEFT JOIN tblProperty p
    ON u.PropertyID = p.ID

ORDER BY p.PropertyName, t.CarPlateNumber
Run Code Online (Sandbox Code Playgroud)

存储过程是这样的:

SELECT tenant.ID AS TenantID, SUM(ISNULL(trans.Amount,0)) AS TenantBalance FROM tblTenant tenant
    LEFT JOIN tblTransaction trans
    ON tenant.ID = trans.TenantID
    GROUP BY tenant.ID
Run Code Online (Sandbox Code Playgroud)

我想从存储过程中添加余额.

我怎样才能做到这一点?

dev*_*vio 45

将SP的结果插入临时表,然后加入:

CREATE TABLE #Temp (
    TenantID int, 
    TenantBalance int
)

INSERT INTO #Temp
EXEC TheStoredProc

SELECT t.TenantName, t.CarPlateNumber, t.CarColor, t.Sex, t.SSNO, t.Phone, t.Memo,
    u.UnitNumber, p.PropertyName
FROM tblTenant t
INNER JOIN #Temp ON t.TenantID = #Temp.TenantID
...
Run Code Online (Sandbox Code Playgroud)


All*_*enG 25

我实际上喜欢上一个答案(不要使用SP),但是如果由于某种原因你被绑在SP本身上,你可以用它来填充临时表,然后加入临时表.请注意,您将花费一些额外的开销,但这是我能够想到使用实际存储过程的唯一方法.

同样,您可能最好将查询从SP内嵌到原始查询中.

  • 我宁愿没有内联它,因为如果我改变了SP,我将不得不在任何地方追捕它并将其更改为 (5认同)
  • @AllenG 我很抱歉,但这不是答案。“不要使用 SP”是避免使用 CROSS APPLY 来做这件事,但如果这不起作用,那么答案应该只是“不,你不能这样做”。句号。说避开SP,把逻辑改成函数不是答案 (2认同)

CAb*_*ott 18

简短的回答是"你不能".您需要做的是使用子查询,或者您可以将现有的存储过程转换为表函数.将其创建为函数将取决于您需要它的"可重用"方式.

  • 返回表的 UDF(用户定义函数)将非常有用。 (2认同)
  • 你说使用'子查询'.那不是解决方案吗?请解释一些代码的含义?谢谢 (2认同)

cjk*_*cjk 10

您的存储过程可以轻松地用作视图.然后,您可以将其加入到您需要的任何其他内容中.

SQL:

CREATE VIEW vwTenantBalance
AS

 SELECT tenant.ID AS TenantID, SUM(ISNULL(trans.Amount,0)) AS TenantBalance 
 FROM tblTenant tenant
 LEFT JOIN tblTransaction trans
 ON tenant.ID = trans.TenantID
 GROUP BY tenant.ID
Run Code Online (Sandbox Code Playgroud)

你可以做任何声明,如:

SELECT t.TenantName, t.CarPlateNumber, t.CarColor, t.Sex, t.SSNO, t.Phone, 
    t.Memo, u.UnitNumber, p.PropertyName, TenantBalance
FROM tblTenant t
LEFT JOIN tblRentalUnit u
 ON t.UnitID = u.ID
LEFT JOIN tblProperty p
 ON u.PropertyID = p.ID
LEFT JOIN vwTenantBalance v 
 ON t.ID = v.tenantID
ORDER BY p.PropertyName, t.CarPlateNumber
Run Code Online (Sandbox Code Playgroud)

  • 我认为您会发现这是比使用临时表更好的答案,因为它仍然是一段集中的代码,只需要在一个地方更新,并且没有创建临时表然后插入的开销进入其中,然后选择退出。 (2认同)

小智 6

我解决了这个问题,编写函数而不是过程,并在SQL语句中使用CROSS APPLY.此解决方案适用于SQL 2005及更高版本.

Gediminas Bukauskas


Fan*_*o68 5

已经有人回答,最好的解决方法是将存储过程转换为SQL函数或视图。

如上所述,简短的答案是您不能直接在SQL中联接存储过程,除非您如上所述使用存储过程的输出将其创建到临时表中并联接临时表,然后再创建另一个存储过程或函数。

我将通过将您的存储过程转换为SQL函数来回答这个问题,并向您展示如何在您选择的查询中使用它。

CREATE FUNCTION fnMyFunc()
RETURNS TABLE AS
RETURN 
(
  SELECT tenant.ID AS TenantID, 
       SUM(ISNULL(trans.Amount,0)) AS TenantBalance 
  FROM tblTenant tenant
    LEFT JOIN tblTransaction trans ON tenant.ID = trans.TenantID
  GROUP BY tenant.ID
)
Run Code Online (Sandbox Code Playgroud)

现在在您的SQL中使用该功能...

SELECT t.TenantName, 
       t.CarPlateNumber, 
       t.CarColor, 
       t.Sex, 
       t.SSNO, 
       t.Phone, 
       t.Memo,
       u.UnitNumber,
       p.PropertyName
FROM tblTenant t
    LEFT JOIN tblRentalUnit u ON t.UnitID = u.ID
    LEFT JOIN tblProperty p ON u.PropertyID = p.ID
    LEFT JOIN dbo.fnMyFunc() AS a
         ON a.TenantID = t.TenantID
ORDER BY p.PropertyName, t.CarPlateNumber
Run Code Online (Sandbox Code Playgroud)

如果您希望通过上述SQL将参数传递到函数中,那么建议您使用CROSS APPLYCROSS OUTER APPLY

这里阅读。

干杯