这是场景;我有一个清单客户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中唯一的方法吗?