【发布时间】:2009-11-16 14:46:12
【问题描述】:
这是场景;我有一个具有相关 OrderIds 的 CustomerIds (1, 2, 3) 列表。我有一个存储过程Delete_OrdersByCustomerIds,它会删除与指定的CustomerIds 相关的所有订单。
目前,我这样做的方法是将 CustomerIds 连接成一个字符串,即“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。 (语法可能不在这里,我在大声思考。)
我不禁觉得这不好。有没有更好的方法来实现同样的目标?我不想自己构建 SQL 语句,我目前正在使用标准的 .Net ADO 包装器。
查看其他问题,即这个one,看来我的方法是可以接受的,那么这是SQL 2005中唯一的方法吗?
【问题讨论】:
标签: c# sql sql-server-2005 stored-procedures ado.net