枢轴 table 不适用于动态参数

Pivot table not worked by dynamic parameter

我写了这个查询:

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

执行时没有记录return但是当用'2016/01/01','2019/10/04'替换@startdate@enddate

查询工作正常我不知道问题是什么...在查询中使用 between 时出现无法将 nvarchar 转换为数据 int 2016 的错误

首先,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