How can I join on a stored procedure?

后端 未结 9 2006
渐次进展
渐次进展 2020-12-25 10:48

I have a stored procedure that takes no parameters, and it returns two fields. The stored procedure sums up all transactions that are applied to a tenant, and it returns the

相关标签:
9条回答
  • 2020-12-25 11:20

    The short answer is "you can't". What you'll need to do is either use a subquery or you could convert your existing stored procedure in to a table function. Creating it as function would depend on how "reusable" you would need it to be.

    0 讨论(0)
  • 2020-12-25 11:22

    I hope your stored procedure is not doing a cursor loop!

    If not, take the query from your stored procedure and integrate that query within the query you are posting here:

    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
    

    If you are doing something more than a query in your stored procedure, create a temp table and execute the stored procedure into this temp table and then join to that in your query.

    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
    
    0 讨论(0)
  • 2020-12-25 11:24

    Why not just performing the calculation in your 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
    
    0 讨论(0)
  • 2020-12-25 11:31

    I resolved this problem writing function instead of procedure and using CROSS APPLY in SQL statement. This solution works on SQL 2005 and later versions.

    0 讨论(0)
  • 2020-12-25 11:33

    Here's a terrible idea for you.

    Use an alias, create a new linked server from your server to its own alias.

    Now you can do:

    select a.SomeColumns, b.OtherColumns
    from LocalDb.dbo.LocalTable a
    inner join (select * from openquery([AliasToThisServer],'
    exec LocalDb.dbo.LocalStoredProcedure
    ') ) b
    on a.Id = b.Id
    
    0 讨论(0)
  • 2020-12-25 11:35

    It has already been answered, the best way work-around is to convert the Stored Procedure into an SQL Function or a View.

    The short answer, just as mentioned above, is that you cannot directly JOIN a Stored Procedure in SQL, not unless you create another stored procedure or function using the stored procedure's output into a temporary table and JOINing the temporary table, as explained above.

    I will answer this by converting your Stored Procedure into an SQL function and show you how to use it inside a query of your choice.

    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
    )
    

    Now to use that function, in your 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
    

    If you wish to pass parameters into your function from within the above SQL, then I recommend you use CROSS APPLY or CROSS OUTER APPLY.

    Read up on that here.

    Cheers

    0 讨论(0)
提交回复
热议问题