枢轴 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
我写了这个查询:
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