Сводная таблица не работает по динамическому параметру - PullRequest
0 голосов
/ 02 ноября 2019

Я написал этот запрос:

declare @startdate nvarchar(10) = '2016/01/01',
        @enddate nvarchar(10) = '2019/10/04',
        @cols nvarchar(max),
        @strsql nvarchar(max);

select 
    @cols =
    (select distinct QUOTENAME(maintenancename)+','
       from (select distinct maintenancename 
          from Table_maintenancetype where coalesce(maintenancename, '') != '') AS t1   
       for xml path('')    
    ) 
set @cols=LEFT(@cols,LEN(@cols)-1)

set @strsql=N'select *
from
(select sum(timedurationok) as wt, maintenancetype,tcode
            from Table_maintenancereport    
            where ((svok=1 and need_netok=0) or (svok=1 and netok=1 and need_netok=1))and tcode<>-1
            and dateendrole >='+ @startdate+ 'and dateendrole<='+ @enddate+'
            group by maintenancetype,tcode
) d 
pivot
(sum(wt)
for maintenancetype in ('+@cols+')
) piv
'

exec sp_executesql @strsql

При выполнении этой записи запись не возвращается, но при замене @startdate и @enddate на '2016/01/01', '2019/10/04'

Запрос работает нормально, я не знаю, в чем проблема ... и при использовании между запросами я получаю сообщение об ошибке, не могу преобразовать nvarchar в данные int 2016

1 Ответ

3 голосов
/ 02 ноября 2019

сначала, сделайте print @strsql, чтобы показать свой динамический запрос и проверьте.

Вы увидите, что ваш запрос dateendrole >= 2016/01/01

дата должна быть в одинарной кавычке dateendrole >= 2016/01/01'

ваш запрос должен быть

and dateendrole >= '''+ @startdate+ ''' and dateendrole<= '''+ @enddate+'''

лучший способ - использовать параметр с sp_executesql

, объявив обе переменные как date тип данных, так как он собираетсядля хранения значения даты

declare @startdate date = '20160101',
        @enddate   date = '20191004'

и в вашем динамическом запросе просто используйте переменную

and dateendrole >= @startdate and dateendrole <= @enddate

, наконец, при вызове sp_executesql, передайте переменную. И не забудьте распечатать подтвердить свой запрос

print @strsql
exec sp_executesql @strsql, N'@startdate date, @enddate date', @startdate, @enddate
...