我正在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
谢谢!
答案 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=''
时尝试