参数在SSMS中起作用但不在SSRS中起作用

时间:2014-05-21 18:56:17

标签: sql sql-server tsql reporting-services ssms

假设我有以下查询(我真正使用的简化版本)......

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如何处理所有'。因为当我输入任何服务器名称时它工作正常。只有'全部'有问题。所以我想我的问题是,你如何设置参数来做到这一点?

1 个答案:

答案 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”。