2013-10-31 46 views
1

我想在PIVOT中动态地传递值。请检查下面的代码,我得到了错误 - 必须声明标量变量“@empid”。请帮我...在SQL透视中添加动态值

declare @empid nvarchar(20), @fromdate date, @todate date, @cols nvarchar(max), @query nvarchar(max) 
set @empid = 'EC0100' 
set @fromdate = '10/01/13' 
set @todate = '10/31/13' 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(c._Date) 
     FROM MIS_BM_Calendar c 
     where c._Date between @fromdate and @todate 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

set @query = 'select * from 
(
select e.UserName, c._Date ,SUM(DATEDIFF(SS,0,c.TimeTaken)) As TimeTaken from MIS_BM_Users e 
inner join MIS_Opus c on 
e.EmpId=c.EmpId 
where [email protected] and c._Date between @fromdate and @todate 
group by c._Date, e.UserName 
) As SourceTable 
Pivot 
(
SUM(TimeTaken) for _Date In ('+ @cols +') As Pvt' 

execute(@query) 

回答

1

我自己找到了。这里是正确的代码...

ALTER Procedure [dbo].[MIS_AccountReport] (@AccountManagerId nvarchar(20), @Startdate datetime, @Enddate datetime, @Condition1 nvarchar(20),@condition2 nvarchar(20) 
) 
As 
Begin 
declare @cols nvarchar(max), @query AS VARCHAR(MAX), @hr nvarchar(10), @min nvarchar(10) set @hr='Hr(s)' 
set @min='Min(s)' 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(nvarchar(20),c._Date, 101)) 
     FROM MIS_BM_Calendar c 
     where c._Date between @Startdate and @Enddate 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 



set @query= 'select UserName, '[email protected]+' from 
(
select e.UserName, c._Date ,SUM(DATEDIFF(SS,0,c.TimeTaken)) As 
TimeTaken from MIS_BM_Users e 
inner join MIS_Opus c on e.EmpId=c.EmpId 
where (e.AccountManagerID='''[email protected]+''') 
and c.Category not in ('''[email protected]+''', '''[email protected]+''') 
group by c._Date, e.UserName 
) As SourceTable 
Pivot 
(
SUM(TimeTaken) for _Date in ('[email protected]+') 
) As Pvt' 

execute(@query) 
End