-2

手動でピボットするためのストアド プロシージャがあります

ALTER procedure [dbo].[performancepivot] (
    @startdate datetime, 
    @enddate datetime
) as begin

    set nocount on
    declare @date1 nvarchar(100)=convert(varchar, @startdate+'00:00:00.000',120),
            @date2 nvarchar(100)= convert(varchar, @enddate+'23:59:59.000',120);

    with cte as (select l.LocName, v.Vtype,sum(datediff(mi, t.DelDate, t.Paydate)) as TotalDiff,
          dbo.testfunctionstacknew(convert(decimal(10,1),avg(convert(numeric(18,2), datediff(ss, t.Paydate, t.DelDate))))) as Average
        from Transaction_tbl as t
            left join VType_tbl as v on t.vtid = v.vtid
            left join Location_tbl as l on t.Locid = l.Locid
        where t.Locid in (select t1.Locid from Transaction_tbl as t1)
          and t.dtime between @date1 and @date2
          and t.Status = 5
        group by v.Vtype, l.LocName, l.Locid)

    select c.LocName, 
        max(case when c.Vtype = 'Normal' then Average end) as Normal,
        max(case when c.Vtype = 'Vip' then Average end) as Vip,
        max(case when c.Vtype = 'VVip'   then Average end) as VVip,   
        max(case when c.Vtype = 'Pass' then Average end) as Pass,
        max(case when c.Vtype = 'Staff' then Average end) as Staff  
    from cte as c group by c.LocName order by c.LocName
end

これを実行している間、私は正確な出力を得ています..私は手動でピボットしたくありません..だから私はストアドプロシージャ「自動的にピボット」を書き込もうとしています..私はこのようなストアドプロシージャを書き込もうとしています:

ALTER procedure [dbo].[ParkingSummary1]
     @startdate nvarchar(100), @enddate nvarchar(100) as
    begin 
      declare @date1 nvarchar(100) = convert(varchar, @startdate+' 00:00:00.000', 120)
      declare @date2 nvarchar(100) = convert(varchar, @enddate+' 23:59:59.000', 120)
      DECLARE @cols AS NVARCHAR(MAX),@query  AS NVARCHAR(MAX)
      select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Vtype) from VType_tbl
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')  ,1,1,'')
      set @query = 'SELECT LocName, ' + @cols + '  from (select l.LocName,Vtype from Transaction_tbl t join VType_tbl v on t.vtid = v.vtid join dbo.Location_tbl l on t.locid=l.Locid  where dtime between '''+ @date1 +''' and '''+ @date2 +'''  
      and Status = 5) d  pivot  ( count(Vtype) for Vtype in (' + @cols + ')) p '
      print @query
    end

しかし、このストアドプロシージャを実行している間、私は値を取得していません..私はこのストアドプロシージャに何か問題があることを知っています.2番目のストアドプロシージャに問題があることを知っています..誰かが知っているなら、私を見つけてください.

4

1 に答える 1

0

書かれているように、ストアド プロシージャは、作成した動的 SQL クエリを実行しません。print @query次のステートメントに置き換えるか、単に追加してください。

EXECUTE (@query);

またはこれ:

EXECUTE sp_executesql @query;

詳細については、次を参照してください。

于 2013-09-19T06:56:38.413 に答える