动态过滤器和sp_executesql

时间:2015-06-03 09:34:02

标签: sql-server tsql

我有一个存储过程,它有一个参数@SomeFilterIds,它接受逗号分隔的整数id。如果此参数不为NULL,则将其转换为以下内容:

AND [X] IN(1, 2, 4) 

并分配给@SomeFilter

然后我沿着这些方向使用了一些东西:

SET @Sql = N' ...WHERE    
 c.SomeDate >= @SomeDate
' + @SomeFilter

SET @ParameterDefinition = N'@SomeDate DateTime';
EXEC sp_executesql 
@Sql
,@ParameterDefinition
,@SomeDate = @SomeDate

我认为这不是最佳做法,并且会打开潜在的安全漏洞。它是否正确?这可以改善吗?谢谢。

1 个答案:

答案 0 :(得分:1)

我认为代替@SomeFilterIds作为varchar参数,您可以使用XML类型变量,然后使用内部联接主表与此XML变量。 这将避免动态查询执行,并且会更安全。

示例:

--Instead of comma separated ID use below XML
declare @xml xml = '<row><ID>1</ID></row><row><ID>3</ID></row>'

--Assume this is your other table
declare @YourTable table (ItemId int, ColA varchar(20))

insert @YourTable
select 1, 'Hello World'


--Joining both the tables

select  col.value('data(ID[1])', 'int') as ID
from    @xml.nodes('/row') tbl(col) 
inner join @YourTable t2 
on t2. ItemId=tbl.col.value('data(ID[1])', 'int')
--WHERE  c.SomeDate >= @SomeDate