使用参数化查询在SSRS中执行子查询

时间:2019-08-08 02:35:26

标签: sql sql-server dynamic reporting-services parameters

摘要: 我有一个查询,希望对SSRS中用户指定的表和用户指定的日期进行参数化。该查询包括多个CTE。 如何将准查询用作CTE?

我已经能够将“ selectedData”参数化,它的工作方式如下:

declare @cmd nvarchar(max)
Select @cmd = ' select  [id] 
      ,[theTime]
      ,[theDate]
      ,[KW]
      ,[airspeed_mph]
     , [avg_drive_speed]
     ,Lag([avg_drive_speed]) over (order by id) previousValue
From [tunnelData].[dbo].['  + @tunnel + ']
where [theDate]>=(' + @date + ' )'
exec (@cmd)

现在,我想将此作为CTE添加,以进一步减少查询中的数据。以下代码是我的尝试,但我从SSRS的查询设计器收到“在'declare'附近的语法不正确”的错误

-- First the Paramerized Table

WITH selectedData as (
declare @cmd nvarchar(max)

Select @cmd = ' select  [id] 
      ,[theTime]
      ,[theDate]
      ,[KW]
      ,[airspeed_mph]
      ,[avg_drive_speed]
     ,Lag([avg_drive_speed]) over (order by id) previousValue
From [tunnelData].[dbo].['  + @tunnel + ']
where [theDate]>=(' + @date + ' )'
exec (@cmd)  ),


-- Second Table to Reduce Data

lagData as (
    SELECT *,
        Lag([theTime]) over (order by id) previousTime
    from selectedData
    where [avg_drive_speed] >= 40 and previousValue < 40 OR [avg_drive_speed] < 40 and previousValue >= 40
    ) 

-- Last Select to Calculate Difference

Select *,
Case 
    when avg_drive_speed >= 40
    then 0 
    else datediff(SECOND, previousTime, [theTime]) 
end AS runTime

from lagData
order by [theDate] ASC, [theTime] ASC

我可以在不进行参数设置的情况下运行CTE,并且可以运行:

With selectedData as (
    Select
       [id]
      ,[theTime]
      ,[theDate]
      ,[KW]
      ,[airspeed_mph]
      ,[avg_drive_speed]
      ,Lag([avg_drive_speed]) over (order by id) previousValue

      FROM [tunnelData].[dbo].[aus]                                             
      where [theDate]>='2019-08-07' and [theDate]<= '2019-08-07'
      ),

lagData as (
    SELECT *,
        Lag([theTime]) over (order by id) previousTime
    from selectedData
    where [avg_drive_speed] >= 40 and previousValue < 40 OR [avg_drive_speed] < 40 and previousValue >= 40
    ) 

Select *,
Case 
    when avg_drive_speed >= 40
    then 0 
    else datediff(SECOND, previousTime, [theTime]) 
end AS runTime

from lagData
order by [theDate] ASC, [theTime] ASC

如果删除半参数化(@tunnel / @date)并在其上方立即运行代码,则可以得到以下结果:

Output Table Image from SSMS

1 个答案:

答案 0 :(得分:0)

好吧,您将整个查询放在动态变量中:

Point[]

相应地填写省略号。

但是要非常小心。您的代码很容易通过@tunnel和@date变量进行sql注入。