我创建了一个报告,我必须在参数中选择多个逗号分隔值。当我只提出像
这样的查询时select 'DB1' DBName, C1, C2, C3 from DB1.T1 inner join DB1.T2 on T1.C4 = T2.C4
where 'DB1' in (@SelectedDatabase)
UNION ALL
select 'DB2' DBName, C1, C2, C3 from DB2.T1 inner join DB2.T2 on T1.C4 = T2.C4
where 'DB2' in (@SelectedDatabase)
UNION ALL
select 'DB3' DBName, C1, C2, C3 from DB3.T1 inner join DB3.T2 on T1.C4 = T2.C4
where 'DB3' in (@SelectedDatabase)
报告适用于多个值。但是当我把这个逻辑放入存储过程中。对于单值它 工作正常,但多重价值,它无法正常工作。 有人可以帮助我。
答案 0 :(得分:3)
首先要注意的是这两段代码不一样......
SELECT * FROM table WHERE id IN (1,2,3)
与...相比
SET @list = '1,2,3'
SELECT * FROM table WHERE id IN (@list)
在后一种情况下,@ list不是数字列表,而是单个字符串。它被视为1项的列表,其中该项是字符串。
为了“完美”概括,你可以编写一个表值函数(在网上有数百个),它接受一个字符串并将其拆分为一个值表。这使您可以这样做......
WHERE 'DB1' IN (SELECT * FROM dbo.split(@list))
如果列表中几乎可以包含任意数量的项目,并且每个项目几乎都是任何值,那么这一点尤为出色。
但是,在您的情况下,您的列表很短,并且受限于极少数可能的枚举值。这意味着你可以轻易“欺骗”......
WHERE @list LIKE '%DB1%'
Or, if you want to be very rigorous...
WHERE ',' + @list + ',' LIKE '%,DB1,%'
如果你有(或将来可能会使用)拆分功能,我会使用这种方法只是为了保持一致。
如果你想快速获胜,那么以这种方式使用LIKE(在常数/参数上),在我看来完全没问题。