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内嵌到原始查询中.
CAb*_*ott 18
简短的回答是"你不能".您需要做的是使用子查询,或者您可以将现有的存储过程转换为表函数.将其创建为函数将取决于您需要它的"可重用"方式.
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)
已经有人回答,最好的解决方法是将存储过程转换为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 APPLY或CROSS OUTER APPLY。
在这里阅读。
干杯
| 归档时间: |
|
| 查看次数: |
139347 次 |
| 最近记录: |