在使用IN Clause进行动态查询时需要帮助

时间:2012-08-07 12:18:06

标签: sql sql-server sql-server-2008

我有1个表,它被命名为ProductMaster。另一个表是VendorMaster。现在我想找到指定Vendormaster的所有产品。

所以我想使用SQL Server的IN子句。

我将以逗号分隔格式传递VendorName。例如HP,LENOVO

我使用函数“f_split”以逗号(,)作为分隔符拆分字符串。

我必须生成动态查询,因为我想为不同的参数使用自定义where子句。

所以请告诉我该怎么做?

3 个答案:

答案 0 :(得分:2)

如果你的名字是

 declare @in varchar(100)
 select @in = 'HP,LENOVO'

您可以使用动态SQL

 declare @sql nvarchar(1000)
 select @sql = 'select * from yourtable where yourfield in ('+@in +')'
 exec sp_executesql @sql

或者你可以让你的分割函数返回一个表

 select * 
 from yourtable
     inner join dbo.f_Split(@in) f 
     on yourtable.yourfield =f.entry

第二个更好,因为它可以防止SQL注入类攻击

答案 1 :(得分:1)

最好单独使用连接和可空参数

考虑这个table1 id加入表2 id,而where子句可以使用参数p1作为col1,p2作为col2等...

select * 
from table1 t1
inner join table2 t2 on t2.id = t1.id -- join the tables
where 1=1
and t2.col1 = isnull(p1, t2.col1)
and t2.col2 = isnull(p2, t2.col2)
.
. -- etc...
.

如果p1为null,那么你得到t2.col1 = t2.col1的测试,它有效地从where子句中解除了p1。

答案 2 :(得分:0)

你可以使用

SELECT * FROM ProductMaster WHERE VendorId IN (
  SELECT DISTINCT VendorId FROM VendorMaster 
  WHERE PATINDEX('%'+VendorName+'%',@VendorNameCommaSeparated)>0
)