gpt4 book ai didi

c# - 在 ado.net DBParameter 中将数组作为值传递

转载 作者:太空狗 更新时间:2023-10-29 21:42:19 26 4
gpt4 key购买 nike

我正在处理的项目有很多 IN 查询,例如:

SELECT something, anotherthing
FROM atable
WHERE something IN (value1, value2, value3)

这是在 IN 部分中具有 3 个参数的查询示例,但可以使用 1 或 2 或 5 或 10 或 ... 参数执行相同的查询。问题是每个查询在数据库中都有另一个执行计划,这使得它变慢了。

我想像这样查询:

SELECT something, anotherthing
FROM atable
WHERE something IN (@value1, @value2, @value3)

或者这个:

SELECT something, anotherthing
FROM atable
WHERE something IN (@values)

我已经用一些辅助函数完成了第一个查询,但我仍然对每个参数数量有不同的执行计划。这可以用第二个解决。

将数组作为数据库参数传递的最佳方法是什么?我正在使用 Oracle 和 SQL Server,欢迎为它们提供解决方案。

最佳答案

对于 SQL-Server,有两种常用的方法。 要避免的第三个选项是传入一个varchar并将其连接到一个带有IN的动态SQL语句中——这是一个明显的注入(inject)攻击表面。

合理的选择:

  • 传入 varchar 并使用 UDF 在分隔符 ( like in this question ) 上拆分数据,可能是逗号、竖线、制表符等。加入结果:

    SELECT something, anotherthing
    FROM atable a
    INNER JOIN dbo.SplitUDF(@values) udf
    ON udf.Value = a.something
  • 使用table-valued-parameter (SQL2008) 直接加入(避免UDF)

关于c# - 在 ado.net DBParameter 中将数组作为值传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1968763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com