关于SQLServer存储过程动态拼接,模糊查询的处理

在进行sql存储过程的动态拼接时,有可能会有特殊符号,如" ' "这种符号的拼接,造成数据库的安全隐患,造成sql注入危险。为了避免sql注入,sqlserver2005之后中可以用sp_executesql进行动态的sql语句参数化,避免了sql注入的可能

sp_executesql语法如下:

declare @sqlstr nvarchar(max)
declare @user varchar(20)
set @user='55'
exec  sp_executesql N'select * from Users where Users.idcard=@user',N'@user varchar(20)',@user
以上代码中,是查询users表中的idcard列中等于55的数据。

可以看出,当条件变成以下:


declare @sqlstr nvarchar(max)
declare @user varchar(20)
set @user='55'
exec  sp_executesql N'select * from Users where Users.idcard like ''%@user%''',N'@user varchar(20)',@user


这时,用在模糊查询的参数,不会识别,而是当做是'@user'条件进行模糊查询,而表中idcard列中不会有'@user'这个记录的。结果肯定就出问题了,条件没有用了,这个时候,就需要改一下代码。

declare @sqlstr nvarchar(max)
declare @userid varchar(20)='55'
--添加一个变量@u
declare @u varchar(20)
set @u='%'+@userid+'%'
exec  sp_executesql N'select * from Users where Users.idcard like @u',N'@u varchar(20)',@u


以上代码,通过一个变量@u事先进行了模糊查询中'%'号的拼接,在拼接搜索字符串时,把这个事先拼接好的@u作为参数代入,再用sp_executesql进行查询时,他的参数就是@u了,不会再有单引号的影响了,拼接后就是我们想要的搜索语句:

select * from Users where Users.idcard like '%55%'


自我评价:

在这次的存储过程编写中,一开始的目标是少用判断,直接拼接字符串,后来发现,用户的输入可能导致数据库的安全隐患。看了一些资料,用了sp_executesql,结果存储过程的条件中有模糊查询,用sp_executesql后发现,定义的变量变成搜索条件进行了查询,找了半天,才想出了这个办法,新人,又多学了一些知识。

你可能感兴趣的:(SQLServer)