【问题标题】:Perform Subquery in SSRS with Parameterized Query使用参数化查询在 SSRS 中执行子查询
【发布时间】:2019-08-08 02:35:26
【问题描述】:

总结: 我有一个查询,我想在 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

【问题讨论】:

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


【解决方案1】:

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

declare @cmd nvarchar(max) = '

    with 

        selectedData as (

            select     ....
            from       [tunnelData].[dbo].[' + @tunnel +']                                             
            where      [theDate] >= ''' + @date + '''

        ),

        lagData as (...) 

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

';

exec (@cmd);

相应地填写省略号。

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

【讨论】:

  • 太棒了。这完美地工作。谢谢你 pwilcox。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多