[英]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.