存储过程的逻辑用于在参数中选择多个逗号分隔值?

时间:2011-11-29 13:43:35

标签: sql sql-server tsql stored-procedures

我创建了一个报告,我必须在参数中选择多个逗号分隔值。当我只提出像

这样的查询时
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)

报告适用于多个值。但是当我把这个逻辑放入存储过程中。对于单值它 工作正常,但多重价值,它无法正常工作。 有人可以帮助我。

  1. 用于接受多个逗号分隔值的存储过程的逻辑?
  2. 这是否可能我可以使我的存储过程动态以动态获取数据库名称(对于每个新数据库,我不必每次都改变我的过程)。

1 个答案:

答案 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(在常数/参数上),在我看来完全没问题。