多值参数为空时选择所有记录

时间:2019-01-10 21:49:11

标签: sql-server tsql reporting-services

我正在SSRS中创建报告,希望有一个多值参数,但允许使用空白值(''),并在空白时显示所有记录。

其要旨是:

SELECT *
FROM Products p
JOIN ProductCategories c on c.ProductId = p.Id
WHERE (c.Name IN (@Categories) OR @Categories = '')

在空白时可以使用,适用于1个类别,但错误适用于2个类别。我们通过使用临时表解决了这个问题,但是该解决方案似乎有点不可靠,所以我想看看是否有更好的方法来解决这个问题。

我们构建的临时表解决方法是这样:

CREATE TABLE #temp (ProductId INT, Category NVARCHAR(MAX))

INSERT INTO #temp
SELECT p.Id, c.Name
FROM Products p
JOIN ProductCategories c on c.ProductId = p.Id
WHERE c.Name IN (@Categories)

IF ((SELECT COUNT(*) FROM #temp) = 0)
BEGIN
INSERT INTO #temp
SELECT p.Id, c.Name
FROM Products p
JOIN ProductCategories c on c.ProductId = p.Id
WHERE c.Name LIKE '%'
END

SELECT * FROM #temp

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您没有拆分/解析功能

示例

 ...
 Where @Categories = ''
       or
       C.Name in (
                    Select RetVal = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
                    From  (Select x = Cast('<x>' + replace((Select replace(@Categories,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                    Cross Apply x.nodes('x') AS B(i)
                 )

这里是dbFiddle ...您会发现家禽已被排除,然后在@Categories=''时尝试