使用具有可变数量参数的LIKE子句时,如何避免内联SQL

时间:2012-11-28 22:54:01

标签: sql sql-server

给定一个6位数字符串列表(代表社会安全号码的一部分),我需要撤回其SSN与其中一个字符串匹配的用户数据集。我的SQL是:

SELECT DISTINCT
         u.ssn,
         u.name
FROM user u
WHERE (u.ssn LIKE '%111111%' OR u.ssn LIKE '%222222%')

我想使用预准备语句而不是生成内联SQL(注入攻击等)。有没有一种方法可以在不创建内联SQL的情况下获取数据?

similar questions on this site,但我的问题是使用IN子句而不是LIKE不是一个选项。我只给了6位数,并且必须搜索整个10位数的SSN。

P.S。这是一个带有SQL Server后端的.Net应用程序。

1 个答案:

答案 0 :(得分:2)

将搜索字词放在表格中并加入:

declare @SSN table (SSN char(9))
insert into @SSN select '123456789' union select '456789321' union select '789123456'

declare @SearchString table (SearchString varchar(9))
insert into @SearchString select '893' union select '9123'

select ssn.SSN
from @SSN ssn
join @SearchString sst on ssn.SSN like '%' + sst.SearchString +'%'

如果性能存在问题,并且搜索字符串的长度始终至少为5个字符(例如),则可以使用每个SSN和每个可能的5个字符的子字符串创建一个表。然后,您可以在匹配值而不是部分值上加入列。但同样,这取决于您的要求。