【问题标题】:Pivot table not worked by dynamic parameter数据透视表不适用于动态参数
【发布时间】: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) - 改用 DATEDATETIME2(n)

标签: sql-server dynamic pivot-table dynamicquery


【解决方案1】:

首先,执行print @strsql 以显示您的动态查询和检查。

你会看到你的查询是dateendrole &gt;= 2016/01/01

日期应该用单引号dateendrole &gt;= 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

【讨论】:

  • 任何告诉某人停止(不安全地)在查询中注入参数的答案都会得到我的 +1。
猜你喜欢
  • 1970-01-01
  • 2016-06-30
  • 2014-10-16
  • 2010-12-28
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多