我有一个存储过程,它有一个参数@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
我认为这不是最佳做法,并且会打开潜在的安全漏洞。它是否正确?这可以改善吗?谢谢。
答案 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