ver salida resueltos procedimientos procedimiento parametros para mostrar fecha ejercicios ejemplo ejecutar devolver declarar datos con codigo almacenados almacenado sql sql-server-2005-express

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 ...