Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用参数数目可变的LIKE子句时如何避免内联SQL_Sql_Sql Server - Fatal编程技术网

在使用参数数目可变的LIKE子句时如何避免内联SQL

在使用参数数目可变的LIKE子句时如何避免内联SQL,sql,sql-server,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的情况下获取数据 有,但在我的例子中,问题

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

SELECT DISTINCT
         u.ssn,
         u.name
FROM user u
WHERE (u.ssn LIKE '%111111%' OR u.ssn LIKE '%222222%')
我想使用准备好的语句而不是生成内联SQL(注入攻击等)。有没有一种方法可以在不创建内联SQL的情况下获取数据

有,但在我的例子中,问题是使用in子句而不是LIKE不是一种选择。我只得到6位数字,必须搜索整个10位SSN


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

将搜索词放在一个表中,并将它们连接起来:

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个字符子字符串的表。然后可以根据匹配的值而不是部分值连接列。不过,这也取决于您的需求。

可以随时准备绑定语句,只需对每个ssn执行它:…其中u.ssn如“%”| |:ssn | |“%”很好的解决方案。感谢您提供有关性能的提示-我们可能不需要它,但知道它很好。