SQL - 是否有更好的方法将用于 where 子句的键列表传递到存储过程中?

2024-04-24

这是场景;我有一个清单客户ID(1, 2, 3) 具有相关性OrderIds。我有一个存储过程Delete_OrdersByCustomerIds,删除与该订单相关的所有订单客户ID指定的。

目前,我这样做的方法是将客户ID转换为字符串,即“1,2,3”。然后,我将此字符串传递到我的存储过程,并使用以下函数创建一个可以加入的 Int 表:

CREATE FUNCTION [dbo].[iter$simple_intlist_to_tbl] (@list nvarchar(MAX))
   RETURNS @tbl TABLE (number int NOT NULL) AS
BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(',', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (number)
         VALUES (convert(int, substring(@list, @pos + 1, @valuelen)))
      SELECT @pos = @nextpos
   END
  RETURN
END

然后我就做一个DELETE FROM Orders WHERE CustomerId IN iter$simple_intlist_to_tbl(@CustomerIds).number。 (语法可能不正确,我正在大声思考。)

我不禁感觉这是bad。有没有更好的方法来实现同样的目标?我不想自己构建 SQL 语句,我当前正在使用标准 .Net ADO 包装器。

看看其他问题,即这个one https://stackoverflow.com/questions/114504/is-it-possible-to-send-a-collection-of-ids-as-a-ado-net-sql-parameter,看来我的方法是可以接受的,那么这是在SQL 2005中唯一的方法吗?


使用 XML 将数组传递给 STP。例子:

CREATE PROC myProc
(
    @list AS XML
)
AS
(
    SELECT items.item.value('.', 'VARCHAR(MAX)') AS Item
    FROM @list.nodes('list/item') items(item)
)

调用STP:

 myProc '<list><item>a</item><item>b</item></list>'

@Tom:可以找到性能评估here http://www.sommarskog.se/arrays-in-sql-2005.html#XML

主要的教训是,除非您愿意使用 CLR 代码,否则 XML 是最快的方法:

在我的测试中,XML 的执行时间比 CLR 高 40-60%,但它是迭代方法的两倍。事实上,XML是最快的方法,不需要在服务器上做任何准备

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL - 是否有更好的方法将用于 where 子句的键列表传递到存储过程中? 的相关文章

随机推荐