【发布时间】:2020-02-28 08:59:53
【问题描述】:
我写了这个查询:
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
【问题讨论】:
-
Bad habits to kick : choosing the wrong data type - 你应该始终使用最合适的数据类型 - 毕竟这就是它们的用途!
@startdate和@enddate显然 日期 - 所以你应该不将它们声明为nvarchar(10)- 改用DATE或DATETIME2(n)!
标签: sql-server dynamic pivot-table dynamicquery