Joc*_*hen 6 c# sql-server oracle ado.net
我正在研究的项目有很多IN查询,例如:
SELECT something, anotherthing
FROM atable
WHERE something IN (value1, value2, value3)
Run Code Online (Sandbox Code Playgroud)
这是在IN部分中具有3个参数的查询的示例,但是可以使用1或2或5或10或...参数执行相同的查询.问题是每个查询在数据库中都有一个其他执行计划,使其变慢.
我想要这样的查询:
SELECT something, anotherthing
FROM atable
WHERE something IN (@value1, @value2, @value3)
Run Code Online (Sandbox Code Playgroud)
或这个:
SELECT something, anotherthing
FROM atable
WHERE something IN (@values)
Run Code Online (Sandbox Code Playgroud)
我用一些辅助函数完成了第一个查询,但是每个参数的数量仍然有不同的执行计划.这可以用第二个解决.
将数组作为数据库参数传递的最佳方法是什么?我正在使用Oracle和SQL Server,欢迎使用这两种解决方案.
对于 SQL-Server,有两种常见的方法。要避免的第三个选项是传入 avarchar并将其连接到动态 SQL 语句中IN- 这是一个明显的注入攻击面。
合理选择:
传入 avarchar并使用 UDF 在分隔符上分割数据(就像在这个问题中一样),可能是逗号、竖线、制表符等。连接到结果:
SELECT something, anotherthing
FROM atable a
INNER JOIN dbo.SplitUDF(@values) udf
ON udf.Value = a.something
Run Code Online (Sandbox Code Playgroud)