假设我有以下查询(我真正使用的简化版本)......
DECLARE @p_ServerName nvarchar(10)
SELECT SystemName FROM Table_x
WHERE SystemName = @p_ServerName OR @p_ServerName = 'all'
当我将参数设置为特定名称ex:DB1时,行显示在SSRS中 但是当我输入所有'作为参数,不显示任何内容。然而,当我在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如何处理所有'。因为当我输入任何服务器名称时它工作正常。只有'全部'有问题。所以我想我的问题是,你如何设置参数来做到这一点?
答案 0 :(得分:1)
从您的问题中不清楚哪个参数在执行“ALL”过滤时遇到问题。但是从查看您的两个查询看起来它是@p_ServerName
参数。在您的第一个查询中,其他两个似乎已经正确完成了“ALL”过滤。
所以问题必须在这里:
(c1.SystemName = @p_ServerName OR c1.SystemName = c1.SystemName)
首先,你想用第二部分实现什么? c1.SystemName=c1.SystemName
将始终为真(除非c1.SystemName为NULL
,如果这是您的目标,请使用c1.SystemName IS NOT NULL
我认为这看起来应该更像:
(c1.SystemName=@p_ServerName OR @p_ServerName='all')
你是如何实现其他两个参数的,所以也许我错过了一些东西。
另外,当你说UNIONed查询解决方案必须是SSRS的工作方式时,我不确定你的意思。 SSRS不会根据参数重写您的查询,只是将这些值粘贴在这些变量中供您在查询中使用。如果您的参数@p_ServerName
是一个字符串,那么它只是一个VARCHAR变量,其中包含字符“all”。