55

パラメータを取らないストアド プロシージャがあり、2 つのフィールドを返します。ストアド プロシージャは、テナントに適用されるすべてのトランザクションを合計し、テナントの残高と 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

ストアド プロシージャは次のとおりです。

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

ストアドプロシージャからの残高も追加したいと思います。

これどうやってするの?

4

9 に答える 9

53

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
...
于 2009-05-28T15:03:25.940 に答える
31

私は実際には前の答えが好きです(SPを使用しないでください)が、何らかの理由でSP自体に関連付けられている場合は、それを使用して一時テーブルにデータを入力し、一時テーブルに参加できます。そこでは追加のオーバーヘッドが発生することに注意してください。ただし、実際にストアドプロシージャを使用することを考えることができる唯一の方法です。

繰り返しになりますが、SPからのクエリを元のクエリにインライン化する方がよい場合があります。

于 2009-05-28T14:55:45.487 に答える
20

簡単な答えは「できません」です。実行する必要があるのは、サブクエリを使用するか、既存のストアドプロシージャをテーブル関数に変換することです。関数として作成することは、それがどれだけ「再利用可能」である必要があるかによって異なります。

于 2009-05-28T14:53:03.777 に答える
11

代わりに、ストアド プロシージャをビューとして簡単に使用できます。その後、必要なものに結合できます。

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

次のようなステートメントを実行できます。

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
于 2009-05-28T15:43:54.297 に答える
7

既に回答済みです。最善の回避策は、ストアド プロシージャを SQL 関数またはビューに変換することです。

簡単に言うと、一時テーブルへのストアド プロシージャの出力を使用して別のストアド プロシージャまたは関数を作成し、一時テーブルを JOIN しない限り、SQL でストアド プロシージャを直接 JOIN することはできません。

ストアド プロシージャを 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
)

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

上記の SQL 内から関数にパラメーターを渡したい場合は、CROSS APPLYorを使用することをお勧めしますCROSS OUTER APPLY

ここでそれを読んでください

乾杯

于 2016-08-29T05:00:00.767 に答える
6

プロシージャの代わりに関数を記述し、SQL ステートメントで CROSS APPLY を使用して、この問題を解決しました。このソリューションは、SQL 2005 以降のバージョンで機能します。

于 2009-08-09T10:30:39.583 に答える
2

ストアドプロシージャがカーソルループを実行していないことを願っています。

そうでない場合は、ストアドプロシージャからクエリを取得し、そのクエリをここに投稿するクエリに統合します。

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

ストアドプロシージャでクエリ以外のことを行う場合は、一時テーブルを作成し、この一時テーブルでストアドプロシージャを実行してから、クエリでそれに結合します。

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
于 2009-05-28T14:55:30.840 に答える
0

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
于 2009-05-28T14:55:35.723 に答える