繁体   English   中英

将列名称存储在 SQL 变量中以用于 SSRS 中的动态钻取报告

[英]Store Column Name in SQL Variable to use for Dynamic drilldown report in SSRS

我有一份我制作的包含多个图表的报告。 在每个图表中,5 - 6 个不同的类别组显示在 100% 条形图中。 我正在尝试这样做,以便向下钻取报告可以是动态的,但我需要在 where 语句中使用类别组名称来为每个类别组在该特定列中指定通过/失败值。 通过这种方式,单击哪个栏以及单击系列中的哪个百分比可以将其作为参数值传递给向下钻取。 我正在尝试构建我的 sql 查询,以便可以将类别组名称作为 where 语句中的列名传递,而系列通过/失败将作为该列中的值传递,例如

Where [Policy Request] = 'Fail'

我正在尝试这样做,因此我不必为每个图表创建 5 个向下钻取报告。
我将指定的列和其中的值都是通过 case 语句从查询中的其他值中创建的。 如果我将变量设置为从表本身派生的列名和值之一,我构建的数据集每次都有效,但是当我尝试使用从案例语句生成的列和值声明变量时,我每次都收到此消息

Invalid column name 'Fail'.

即使 Fail 实际上是我正在寻找的值而不是列。 从我测试它的时候开始,我根本没有改变 where 语句的结构,所以我不确定它为什么这样做。 此外,如果不使用变量作为值,而只是在查询中指定它,但将列名保留为变量,则它可以工作。 请我还是个新手,如果我在这里遗漏了什么或者更好的方法,我会全神贯注。 这是我的查询。

DECLARE @MyParm varchar(256) = '[Policy Request]'
DECLARE @Resource varchar(256) = 'Fail'
DECLARE @SQL varchar(max)
SET @SQL = 

'SELECT 
* 
FROM (
SELECT 
summ.ResourceID,
sy.name0,
sy.User_Name0,
Case 
    when Substring(sy.Operating_System_Name_and0,11,7) + '' '' + RTRIM(Substring(sy.Operating_System_Name_and0,34,2)) = ''Windows 10'' Then ''Windows 10''
    when Substring(sy.Operating_System_Name_and0,11,7) + '' '' + RTRIM(Substring(sy.Operating_System_Name_and0,34,3)) = ''Windows 6.1'' Then ''Windows 7''
    Else ''Unknown''
End as ''OS'',
case 
    when summ.LastEvaluationHealthy = 1 then ''Pass''
    when summ.LastEvaluationHealthy = 2 then ''Fail''
    when summ.LastEvaluationHealthy = 3 then ''Unknown''
end as ''Last Evaluation Healthy'',
Case 
    When summ.IsActiveDDR = 1 Then ''Pass''
    When Summ.IsActiveDDR = 0 Then ''Fail''
End as ''Discovery Request'', 
summ.LastDDR,
case 
    when summ.IsActiveHW = 0 then ''Fail''
    when summ.IsActiveHW = 1 then ''Pass''
end as ''Hardware Inventory'',
summ.LastHW,
case 
    when summ.IsActiveSW = 0 then ''Fail''
    when summ.IsActiveSW = 1 then ''Pass''
end as ''Software Inventory'',
summ.LastSW,
case 
    when summ.ISActivePolicyRequest = 0 then ''Fail''
    when summ.ISActivePolicyRequest = 1 then ''Pass''
end as ''Policy Request'',
summ.LastPolicyRequest,
summ.ExpectedNextPolicyRequest,
case 
    when summ.IsActiveStatusMessages = 0 then ''Fail''
    when summ.IsActiveStatusMessages = 1 then ''Pass''
end as ''Status Messages'',
summ.LastStatusMessage ,
case summ.LastEvaluationHealthy 
    when 1 then ''Pass'' else ''Fail'' 
end as ''Client Health Evaluation'',
summ.LastHealthEvaluation,
summ.ClientRemediationSuccess,
case 
    when summ.ClientRemediationSuccess = 1 then ''Pass''
    when summ.ClientRemediationSuccess = 2 then ''Fail''
    else ''''
end as ''ClientRemediationSuccessDescription''

FROM v_CH_ClientSummary summ
Left join v_R_System sy on summ.ResourceID = sy.ResourceID
where 
(sy.Operating_System_Name_and0 like ''Microsoft Windows NT Workstation%'' or sy.Operating_System_Name_and0 is null)
)a

Where ('+@MyParm+') = ('+@Resource+')'

EXEC (@SQL)

要按原样修复查询,您只需将 @Resource 参数的引号加倍

WHERE (' + @MyParm + ') = (''' + @Resource + ''')'

你的原始版本最终看起来像这样

WHERE ([Policy Request]) = (Fail)

代替

WHERE ([Policy Request]) = ('Fail')

注意:您不需要括号,因此您可以将其缩短为 output WHERE [Policy Request] = 'Fail'

你真的真的不应该这样做动态 SQL 这种方式,它是开放的注入和通常不正确的结果。

最好的方法是使用QUOTENAME作为列名。 这意味着您不要在客户端中添加方括号[] 您应该将它们存储在nvarchar(128)中(一个容易记住的别名是sysname )。

使用sp_executesql正确传递参数 注意@Resource实际上是动态 SQL 代码的一部分,而不是连接到它上面。

此外,对 SQL 代码使用nvarchar(max) (Unicode):

DECLARE @MyParm sysname = 'Policy Request'
DECLARE @Resource varchar(256) = 'Fail'
DECLARE @SQL nvarchar(max)
SET @SQL = 

N'SELECT 
* 
FROM
................
................
Where (' + QUOTENAME(@MyParm)+ N') = (@Resource);'

EXEC sp_executesql @SQL, N'@Resource varchar(256)', @Resource = @Resource;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM