[英]Parameter functioning in SSMS but not SSRS
假设我有以下查询(即时通讯实际使用的简化版本)...
DECLARE @p_ServerName nvarchar(10)
SELECT SystemName FROM Table_x
WHERE SystemName = @p_ServerName OR @p_ServerName = 'all'
当我将参数设置为特定名称,例如:DB1时,行显示在SSRS中,但是当我输入“ all”作为参数时,则不显示任何内容。 但是,当我在SSMS中执行相同操作时,它就可以正常工作。
有人知道这里可能有什么问题吗? 谢谢。
编辑
这是我尝试的第一个查询(忽略声明,它仅用于ssms测试,在该测试中效果很好):
DECLARE @p_ServerName nvarchar(10) = 'all'
DECLARE @p_Env nvarchar(10) = 'all'
DECLARE @p_EnvCat nvarchar(10) = 'all'
SELECT DISTINCT
c1.BlockSize, c1.BootVolume, c1.Compressed, c1.SystemName, c1.Label, c1.Caption, c1.PageFilePresent,
[dbo].[CCS_DIGITAL_STORAGE_CONVERTER]('B', 'GB', c1.Capacity) AS Capacity,
[dbo].[CCS_DIGITAL_STORAGE_CONVERTER]('B', 'GB', c1.FreeSpace) AS [Free Space],
[dbo].[CCS_DIGITAL_STORAGE_CONVERTER]('B', 'GB', c1.Capacity - c1.FreeSpace) AS [Used Space],
100 * c1.FreeSpace / c1.Capacity AS [Free Space %],
[CLE_ENV_SHORT], [CLE_ENV_CAT_SHORT]
FROM CCS_Win32_Volume c1
JOIN [dbo].[CCS_V_SERVER_INSTANCE_DETAILS] c2 on c1.SystemName = c2.CSL_SERVER_NAME
WHERE (c1.SystemName = @p_ServerName OR c1.SystemName = c1.SystemName)
AND (c2.[CLE_ENV_SHORT] = @p_Env OR @p_Env = 'all')
AND (c2.[CLE_ENV_CAT_SHORT] = @p_EnvCat OR @p_EnvCat = 'all')
ORDER BY c2.[CLE_ENV_CAT_SHORT], c2.[CLE_ENV_SHORT]
这是我尝试过的另一个查询(再次忽略声明):
DECLARE @p_ServerName nvarchar(10) = 'all'
DECLARE @p_Env nvarchar(10) = 'all'
DECLARE @p_EnvCat nvarchar(10) = 'all'
SELECT DISTINCT
c1.SystemName, c1.BlockSize, c1.BootVolume, c1.Compressed, c1.Label, c1.Caption, c1.PageFilePresent,
[dbo].[CCS_DIGITAL_STORAGE_CONVERTER]('B', 'GB', c1.Capacity) AS Capacity,
[dbo].[CCS_DIGITAL_STORAGE_CONVERTER]('B', 'GB', c1.FreeSpace) AS [Free Space],
[dbo].[CCS_DIGITAL_STORAGE_CONVERTER]('B', 'GB', c1.Capacity - c1.FreeSpace) AS [Used Space],
100 * c1.FreeSpace / c1.Capacity AS [Free Space %],
[CLE_ENV_SHORT], [CLE_ENV_CAT_SHORT]
FROM CCS_Win32_Volume c1
JOIN [dbo].[CCS_V_SERVER_INSTANCE_DETAILS] c2 on c1.SystemName = c2.CSL_SERVER_NAME
WHERE c1.SystemName = @p_ServerName
AND (c2.[CLE_ENV_SHORT] = @p_Env OR @p_Env = 'all')
AND (c2.[CLE_ENV_CAT_SHORT] = @p_EnvCat OR @p_EnvCat = 'all')
UNION
SELECT DISTINCT
c1.SystemName, c1.BlockSize, c1.BootVolume, c1.Compressed, c1.Label, c1.Caption, c1.PageFilePresent,
[dbo].[CCS_DIGITAL_STORAGE_CONVERTER]('B', 'GB', c1.Capacity) AS Capacity,
[dbo].[CCS_DIGITAL_STORAGE_CONVERTER]('B', 'GB', c1.FreeSpace) AS [Free Space],
[dbo].[CCS_DIGITAL_STORAGE_CONVERTER]('B', 'GB', c1.Capacity - c1.FreeSpace) AS [Used Space],
100 * c1.FreeSpace / c1.Capacity AS [Free Space %],
[CLE_ENV_SHORT], [CLE_ENV_CAT_SHORT]
FROM CCS_Win32_Volume c1
JOIN [dbo].[CCS_V_SERVER_INSTANCE_DETAILS] c2 on c1.SystemName = c2.CSL_SERVER_NAME
WHERE @p_ServerName = 'all'
AND (c2.[CLE_ENV_SHORT] = @p_Env OR @p_Env = 'all')
AND (c2.[CLE_ENV_CAT_SHORT] = @p_EnvCat OR @p_EnvCat = 'all')
ORDER BY c2.[CLE_ENV_CAT_SHORT], c2.[CLE_ENV_SHORT], c1.SystemName
由于查询的多种变体在SSMS中都能正常工作,因此我假设问题在于SSRS如何处理“全部”。 因为当我输入任何服务器名称时,它都能正常工作。 只有“全部”有问题。 所以我想我的问题是,您如何设置参数来做到这一点?
从您的问题尚不清楚,您很难在哪个参数上实现“ ALL”过滤。 但是从您的两个查询来看,它看起来像是@p_ServerName
参数。 在您的第一个查询中,其他两个查询似乎已正确完成了“ ALL”过滤。
因此问题必须在这里:
(c1.SystemName = @p_ServerName OR c1.SystemName = c1.SystemName)
首先,您要通过第二部分实现什么? c1.SystemName=c1.SystemName
将始终为true(除非c1.SystemName为NULL
,如果这是您的目标,请使用c1.SystemName IS NOT NULL
我认为这应该更像:
(c1.SystemName=@p_ServerName OR @p_ServerName='all')
您是如何实现其他两个参数的,所以也许我遗漏了一些东西。
另外,当您说UNIONed查询解决方案必须是SSRS的工作方式时,我不确定您的意思。 SSRS不会根据参数重写查询,它只是将这些变量中的值粘贴到您的查询中。 如果您的参数@p_ServerName
是一个字符串,则它只是其中包含字符“ all”的VARCHAR变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.