sql - salida - procedimiento almacenado para mostrar datos
¿Cómo puedo unirme a un procedimiento almacenado? (8)
Tengo un procedimiento almacenado que no toma parámetros, y devuelve dos campos. El procedimiento almacenado resume todas las transacciones que se aplican a un inquilino y devuelve el saldo y la identificación del inquilino.
Quiero utilizar el conjunto de registros que devuelve con una consulta, y necesito unirme a los resultados en el ID del inquilino.
Esta es mi consulta actual:
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
El procedimiento almacenado es este:
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
Me gustaría agregar el saldo del procedimiento almacenado a él también.
¿Cómo puedo hacer esto?
¡Espero que su procedimiento almacenado no esté haciendo un ciclo de cursor!
Si no, tome la consulta de su procedimiento almacenado e integre esa consulta dentro de la consulta que está publicando aquí:
SELECT t.TenantName, t.CarPlateNumber, t.CarColor, t.Sex, t.SSNO, t.Phone, t.Memo,
u.UnitNumber,
p.PropertyName
,dt.TenantBalance
FROM tblTenant t
LEFT JOIN tblRentalUnit u ON t.UnitID = u.ID
LEFT JOIN tblProperty p ON u.PropertyID = p.ID
LEFT JOIN (SELECT ID, SUM(ISNULL(trans.Amount,0)) AS TenantBalance
FROM tblTransaction
GROUP BY tenant.ID
) dt ON t.ID=dt.ID
ORDER BY p.PropertyName, t.CarPlateNumber
Si está haciendo algo más que una consulta en su procedimiento almacenado, cree una tabla temporal y ejecute el procedimiento almacenado en esta tabla temporal y luego únase a eso en su consulta.
create procedure test_proc
as
select 1 as x, 2 as y
union select 3,4
union select 5,6
union select 7,8
union select 9,10
return 0
go
create table #testing
(
value1 int
,value2 int
)
INSERT INTO #testing
exec test_proc
select
*
FROM #testing
¿Por qué no solo realizar el cálculo en tu SQL?
SELECT
t.TenantName
, t.CarPlateNumber
, t.CarColor
, t.Sex
, t.SSNO
, t.Phone
, t.Memo
, u.UnitNumber
, p.PropertyName
, trans.TenantBalance
FROM tblTenant t
LEFT JOIN tblRentalUnit u ON t.UnitID = u.ID
LEFT JOIN tblProperty p ON u.PropertyID = p.ID
INNER JOIN (
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
) trans ON trans.ID = t.ID
ORDER BY
p.PropertyName
, t.CarPlateNumber
De hecho, me gusta la respuesta anterior (no utilizo el SP), pero si por algún motivo está vinculado al SP mismo, podría usarlo para llenar una tabla temporal y luego unirse a la tabla temporal. Tenga en cuenta que va a costar algunos gastos adicionales allí, pero es la única forma en que se me ocurre usar el proceso almacenado real.
De nuevo, es mejor que alinee la consulta del SP en la consulta original.
La respuesta corta es "no puedes". Lo que tendrá que hacer es usar una subconsulta o puede convertir su procedimiento almacenado existente en una función de tabla. Crearlo como función dependerá de qué tan "reutilizable" lo necesites.
Resolví esta función de escritura de problemas en lugar de procedimiento y el uso de CROSS APPLY en la declaración de SQL. Esta solución funciona en SQL 2005 y versiones posteriores.
Gediminas Bukauskas
Su procedimiento almacenado podría usarse fácilmente como una vista en su lugar. Entonces puedes unirte a cualquier otra cosa que necesites.
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
El puede hacer cualquier declaración como:
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
Ya se ha respondido, la mejor manera de evitar el problema es convertir el Procedimiento almacenado en una Función SQL o una Vista.
La respuesta breve, tal como se mencionó anteriormente, es que no puede UNIRSE directamente a un Procedimiento almacenado en SQL, a menos que cree otro procedimiento o función almacenada utilizando la salida del procedimiento almacenado en una tabla temporal y UNIENDO la tabla temporal, como se explicó anteriormente.
Responderé esto al convertir su Procedimiento almacenado en una función SQL y le mostraré cómo usarlo dentro de una consulta de su elección.
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
)
Ahora para usar esa función, en tu 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
Si desea pasar parámetros a su función desde el SQL anterior, le recomiendo que utilice CROSS APPLY
o CROSS OUTER APPLY
.
Lee sobre eso here .
Aclamaciones
inserte el resultado del SP en una tabla temporal, luego únase a:
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
...