2013-07-04 5 views
0

Здравствуйте, у меня есть таблица, содержащая пробой сотрудника и выбирая данные из системы учета времени. Я хочу динамически поворачивать столбец данных перфоратора и суммировать диапазон смены сотрудников. Однако у меня возникают проблемы с динамическим стержнем. Я проверил пару других сообщений, но, похоже, я ничего не получаю.SQL Server Dynamic Pivot

Вот код:

USE wfcdb 
DECLARE @cols as NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX); 

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(CONVERT(VARCHAR(10),EVENTDTM,101)) as DATE FROM TIMESHEETITEM WHERE DATEDIFF(d,EVENTDTM,GetDate()) <7 ORDER BY DATE DESC 
         FOR XML PATH(''), TYPE 
         ).value('.','NVARCHAR(MAX)') 
         ,1,1,'') 

Set @query='SELECT EEID, ' + @cols + 'FROM (
SELECT p.PERSONnum as EEID,p.FULLNM as FULLNM, 
convert(varchar(10),ti.EVENTDTM,101) as PunchDate, 
DATEDIFF(MINUTE,ti.enddtm,ti.startdtm)/60*-1 AS SPAN 
FROM ((((( 
    TIMESHEETITEM ti With (NoLock) LEFT JOIN 
     PUNCHEVENT pe With (NoLock) ON ti.STARTPUNCHEVENTID = pe.PUNCHEVENTID) LEFT JOIN 
      DATASOURCE ds ON pe.DATASOURCEID = ds.DATASOURCEID) LEFT JOIN 
       CLIENTCONTEXT cc ON ds.CLIENTCONTEXTID = cc.CLIENTCONTEXTID) 
    LEFT JOIN  PUNCHEVENT AS pe1 With (NoLock) ON ti.ENDPUNCHEVENTID = pe1.PUNCHEVENTID) LEFT JOIN 
      DATASOURCE AS ds1 ON pe1.DATASOURCEID = ds1.DATASOURCEID) LEFT JOIN 
       CLIENTCONTEXT AS cc1 ON ds1.CLIENTCONTEXTID = cc1.CLIENTCONTEXTID 
    INNER JOIN PERSON p ON ti.EMPLOYEEID = p.PERSONID 
    INNER JOIN LABORACCT la1 ON la1.laboracctid = ti.laboracctid 
WHERE DATEDIFF(d,ti.EVENTDTM,GetDate()) <7 
AND ti.TmShtItemTypeID = 40 
AND (isnull(cc.CLNT,'') + isnull(cc1.CLNT,''))<> '') X 
PIVOT 
(
    SUM(SPAN) 
    FOR PunchDate in (' + @cols + ') 
    ) p' 

Execute(@query) 

И вот это сообщение об ошибке я получаю:

Msg 105, Level 15, State 1, Line 17
Unclosed кавычки после того, как персонаж строка ') X PIVOT (.....) p'.
Msg 102, Level 15, State 1, Line 17
Неправильный синтаксис около «) X
PIVOT (.....

Любая помощь будет оценена.

+0

Вы должны изменить эту строку: 'AND (isnull (cc.CLNT, '') + isnull (cc1.CLNT, '')) <> '') X', с этим:' AND (isnull (cc.CLNT, '' '') + isnull (cc1.CLNT, '' '')) <> '' '') X' – Lamak

ответ

0

Поскольку вы конкатенации пустые строки в динамическом SQL вам нужно добавить несколько одинарные кавычки:

AND (isnull(cc.CLNT,'''') + isnull(cc1.CLNT,''''))<> '''') X 

Так полный код будет:

DECLARE @cols as NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX); 

SELECT @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME(CONVERT(VARCHAR(10),EVENTDTM,101)) as DATE 
         FROM TIMESHEETITEM WHERE DATEDIFF(d,EVENTDTM,GetDate()) <7 ORDER BY DATE DESC 
         FOR XML PATH(''), TYPE 
         ).value('.','NVARCHAR(MAX)') 
         ,1,1,'') 

Set @query='SELECT EEID, ' + @cols + 'FROM (
SELECT p.PERSONnum as EEID,p.FULLNM as FULLNM, 
convert(varchar(10),ti.EVENTDTM,101) as PunchDate, 
DATEDIFF(MINUTE,ti.enddtm,ti.startdtm)/60*-1 AS SPAN 
FROM ((((( 
    TIMESHEETITEM ti With (NoLock) LEFT JOIN 
     PUNCHEVENT pe With (NoLock) ON ti.STARTPUNCHEVENTID = pe.PUNCHEVENTID) LEFT JOIN 
      DATASOURCE ds ON pe.DATASOURCEID = ds.DATASOURCEID) LEFT JOIN 
       CLIENTCONTEXT cc ON ds.CLIENTCONTEXTID = cc.CLIENTCONTEXTID) 
    LEFT JOIN  PUNCHEVENT AS pe1 With (NoLock) ON ti.ENDPUNCHEVENTID = pe1.PUNCHEVENTID) LEFT JOIN 
      DATASOURCE AS ds1 ON pe1.DATASOURCEID = ds1.DATASOURCEID) LEFT JOIN 
       CLIENTCONTEXT AS cc1 ON ds1.CLIENTCONTEXTID = cc1.CLIENTCONTEXTID 
    INNER JOIN PERSON p ON ti.EMPLOYEEID = p.PERSONID 
    INNER JOIN LABORACCT la1 ON la1.laboracctid = ti.laboracctid 
WHERE DATEDIFF(d,ti.EVENTDTM,GetDate()) <7 
AND ti.TmShtItemTypeID = 40 
AND (isnull(cc.CLNT,'''') + isnull(cc1.CLNT,''''))<> '''') X 
PIVOT 
(
    SUM(SPAN) 
    FOR PunchDate in (' + @cols + ') 
    ) p' 

execute @query 
+0

Блестящий, не могу поверить, что я его пропустил. Спасибо – user2551567

+0

@ user2551567 Это простая миссия. Один из способов поймать эти ошибки - это «print @ query», а затем вставить результат в SSMS, вы обнаружите проблемы при работе с динамическим SQL – Taryn