1

这是我的要求:

  • 我想删除表格的多行
  • 我有需要在客户端应用程序中删除的所有 id 的列表。
  • 我只想从我的 C# 客户端应用程序中进行一次调用以删除所有这些记录。

我之前的:

foreach (var id in idList)
{
//Call a Stored Procedure which takes the id
//as parameter and deletes the record
}

这是一个问题,因为循环中的每个项目都有一个数据库命中。

然后我开始使用SQL Server 2008 新引入的表类型和表值参数用于存储过程。

  • 首先在数据库中创建一个表类型,该表类型具有单列(Id 类型)
  • 创建一个接受此新表类型(表值参数)的新存储过程
  • 在客户端代码中,创建一个包含所有要删除的 id 的列表/数据表。
  • 对数据库进行一次调用以使用新的存储过程。

它在客户端代码中非常简单,如下所示:

SqlParameter parameter = new SqlParameter();
parameter.SqlDbType = System.Data.SqlDbType.Structured;

好的 - 虽然我达到了我设定的目标,但这绝对不适用于 2008 年之前的 SQL Server 版本。

所以我所做的就是引入一个回退机制:

  • 我介绍了一个存储过程,它采用逗号分隔的 id 值
  • 我的客户端代码将创建这样的逗号分隔的 id,然后简单地将其传递给新的存储过程。
  • 然后存储过程将拆分所有这些 id,然后一一调用 delete。
  • 因此,在某种程度上,即使在 2008 年之前的 SQL Server 版本上,我也实现了我所设定的目标:使用单个数据库命中删除多行。

但我对我采取的最后一种方法并不那么信服——在互联网上快速搜索并没有发现太多东西。

所以有人可以告诉我,如果我用逗号分隔的 id 和所有东西做正确的事情。
如果 id 是已知的,那么通过单个数据库命中从客户端应用程序中删除多条记录的通常最佳做法是什么。

提前致谢。

4

5 回答 5

2

嗨,您只需将列表中的所有值与 delemeter 连接起来,如下所示 1,2,3,4,5

这是删除多行的示例存储过程

create PROCEDURE deleteusers  --deleteusers '1,2,3,4'
    -- Add the parameters for the stored procedure here
    @UsersIds varchar(max)

AS
BEGIN
declare @abc varchar(max)
set @abc='delete from users where userid in('+@UsersIds+')'
exec(@abc)
END
GO

它将删除用户 ID 为 1、2、3、4 的用户

于 2013-02-23T08:54:50.853 回答
1
You can send a string containing comma separated or some other character(to be used for split) to send ids from C# end.

Create Procedure deleteusers
(
@ids nvarchar(MAX)
)
as
begin
DECLARE  @pos bigint,@count int,@id varchar(max),@I int,@Spos int
set @Spos=1
set @I=1
set @count=  len(@ids)-len(REPLACE(@ids,',','')) 
while(@I<=@count)
    begin
        SET @pos = CHARINDEX(',', @ids, 1)


        set @id = substring(@ids,@Spos,@pos-1)
delete from  TableName where id=@id 
set @ids= stuff(@ids, @Spos, @pos,'')

        set @I=@I+1
end
end
于 2014-11-19T07:24:53.887 回答
1

如果你有一个以列分隔的值列表,比如@list,你可以用这个delete语句做你想做的事情:

delete from t
where ','+@list+',' like '%,'+cast(t.id as varchar(255))+',%'

这是用字符串操作模拟in表达式。

缺点是这需要全表扫描。它不会在 id 上使用索引。

于 2013-02-23T02:55:26.600 回答
0

我建议不要在代码中构建 SQL 字符串,而是查看 ORM(对象关系映射器),例如Entity FrameworkNHibernate

于 2013-02-23T07:34:47.203 回答
0

此处列出的动态 SQL 选项可能是您最好的选择,但只是为您提供了更多选择。

CREATE PROCEDURE deleteusers  --deleteusers '1,2,3,4'
-- Add the parameters for the stored procedure here
@UsersIds varchar(max)

CREATE TABLE #DeleteUsers (UserId Int)

-- Split @UserIds and populate into the #DeleteUsers temp table

DELETE FROM Users WHERE UserId IN (SELECT UserId FROM #DeleteUsers)
于 2013-02-23T14:41:04.003 回答