9

このストアド プロシージャによって生成された結果があります。

これらの結果を別のテーブルのデータと結合したいと考えています。一時テーブルを作成してそこに挿入するなど、これを行うさまざまな例を見てきましたが、ストアド プロシージャは変更される可能性のある多くの動的列を返すため、これは理想的ではありません。それらを動的に結合する方法はありますか?

シナリオ例:

ストアド プロシージャはこれを返します。

EXEC uspGetProductCategories

products_id | products_model | Leather Seats | Heated Seats | Tapedeck | Heater | Hybrid | Sunroof | Cruise Control
===================================================================================================================
100         | Saturn Vue     | N             | N            | Y        | N      | N      | N       | N
200         | Toyota Pruis   | Y             | N            | N        | Y      | Y      | N       | N
300         | Ford Focus     | N             | N            | N        | Y      | N      | N       | Y

次のようなものを生成するSQLクエリでJOINしたい:

SELECT * FROM Products_Detail

products_id | manufacturer | purchaser | pay_type
=================================================
100         | GM           | GREG      | P
200         | TOYT         | SAM       | P
300         | FORD         | GREG      | L

言い換えると...

これを達成するための痛みのない方法はありますか?これが私が達成したいことのいくつかの擬似コードです(ただし、これが機能しないことは承知しています):

SELECT pd.*, sp.* FROM Products_Detail pd
    LEFT JOIN uspGetProductCategories sp ON pd.product_id = sp.product_id

繰り返しますが、これができないことはわかっていますが、私が探しているロジックが説明されていることを願っています。

望ましい出力の例

products_id | manufacturer | purchaser | pay_type | products_model | Leather Seats | Heated Seats | Tapedeck | Heater | Hybrid | Sunroof | Cruise Control
=========================================================================================================================================================
100         | GM           | GREG      | P        | Saturn Vue     | N             | N            | Y        | N      | N      | N       | N
200         | TOYT         | SAM       | P        | Toyota Pruis   | Y             | N            | N        | Y      | Y      | N       | N
300         | FORD         | GREG      | L        | Ford Focus     | N             | N            | N        | Y      | N      | N       | Y
4

4 に答える 4

3

動的ストアド プロシージャからのデータを使用して一時テーブルを作成できない場合は、テーブルに直接結合してみませんか。

DECLARE @cols AS NVARCHAR(MAX),
    @colsNull AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(categories_name) 
                    from Categories
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

select @colsNull = STUFF((SELECT ',IsNull(' + QUOTENAME(categories_name)+', ''N'')'+' as '+QUOTENAME(categories_name) 
                    from Categories
                    group by categories_name, categories_id
                    order by categories_id
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = '
            select *
            from Products_Detail pd
            left join
            (
              SELECT products_id,
                    products_model,' + @colsNull + ' from 
               (
                  select p.products_id,
                    p.products_model,
                    c.categories_name,
                    ''Y'' flag
                  from products p
                  left join Products_Categories pc
                    on p.products_id = pc.products_id
                  left join Categories c
                    on pc.categories_id = c.categories_id
              ) x
              pivot 
              (
                  max(flag)
                  for categories_name in (' + @cols + ')
              ) p 
            ) p 
              on pd.products_id = p.products_id'

execute(@query)

デモで SQL Fiddle を参照してください

于 2013-02-25T23:03:01.757 に答える
0

コードを再編成する方法がない場合は、この醜いソリューションを使用してみてください。

SELECT * INTO #tmp
FROM OPENROWSET('SQLNCLI', 'server=INSTANCENAME;database=DBNAME;trusted_connection=yes', 'uspGetProductCategories') A

サーバーで許可している必要がありAd Hoc Distributed Queriesます。

于 2013-02-25T22:48:02.990 に答える
-1

あなたはこれを行うことができます:

        INSERT aTemptable 
        EXEC yourstoredproc

#tが定義されているが、#tを選択して動的に作成することができない場合。

于 2013-02-25T22:37:15.680 に答える
-1
create proc sp_emp18
(
@cust_id int,@name varchar(20),@order_id int,@order_date date
)
as 
begin
select e.cust_id,e.name,d.order_id,d.order_date 
from 
customer e inner join orders d on e.cust_id=d.cust_id
end

exec sp_emp18 101,'ram',99,'2016-07-21'
于 2016-08-04T09:59:33.973 に答える