摘要: 我有一个查询,希望对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)并在其上方立即运行代码,则可以得到以下结果:
答案 0 :(得分:0)
好吧,您将整个查询放在动态变量中:
Point[]
相应地填写省略号。
但是要非常小心。您的代码很容易通过@tunnel和@date变量进行sql注入。