C# 批量删除操作过程不工作

C# 批量删除操作过程不工作,c#,sql,asp.net,sql-server,stored-procedures,C#,Sql,Asp.net,Sql Server,Stored Procedures,我有一个如下所示的存储过程: alter procedure [dbo].[zsp_deleteEndedItems] ( @ItemIDList nvarchar(max) ) as delete from SearchedUserItems WHERE EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@ItemIDList,',') S1 WHERE ItemID=S1.val) 124125125,125125125...etc etc

我有一个如下所示的存储过程:

alter procedure [dbo].[zsp_deleteEndedItems]
(
@ItemIDList nvarchar(max)
)
as
delete from 
SearchedUserItems
WHERE EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@ItemIDList,',') S1 WHERE ItemID=S1.val)
124125125,125125125...etc etc
ALTER FUNCTION [dbo].[SplitStringProduction]
(
  @string nvarchar(max),
  @delimiter nvarchar(5)
) RETURNS @t TABLE
(
  val nvarchar(500)
)
AS
BEGIN
  declare @xml xml
  set @xml = N'<root><r>' + replace(@string,@delimiter,'</r><r>') + '</r></root>'

  insert into @t(val)
  select 
    r.value('.','varchar(500)') as item
  from @xml.nodes('//root/r') as records(r)

  RETURN
END
参数IDList的传递方式如下所示:

alter procedure [dbo].[zsp_deleteEndedItems]
(
@ItemIDList nvarchar(max)
)
as
delete from 
SearchedUserItems
WHERE EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@ItemIDList,',') S1 WHERE ItemID=S1.val)
124125125,125125125...etc etc
ALTER FUNCTION [dbo].[SplitStringProduction]
(
  @string nvarchar(max),
  @delimiter nvarchar(5)
) RETURNS @t TABLE
(
  val nvarchar(500)
)
AS
BEGIN
  declare @xml xml
  set @xml = N'<root><r>' + replace(@string,@delimiter,'</r><r>') + '</r></root>'

  insert into @t(val)
  select 
    r.value('.','varchar(500)') as item
  from @xml.nodes('//root/r') as records(r)

  RETURN
END
拆分字符串函数如下所示:

alter procedure [dbo].[zsp_deleteEndedItems]
(
@ItemIDList nvarchar(max)
)
as
delete from 
SearchedUserItems
WHERE EXISTS (SELECT 1 FROM dbo.SplitStringProduction(@ItemIDList,',') S1 WHERE ItemID=S1.val)
124125125,125125125...etc etc
ALTER FUNCTION [dbo].[SplitStringProduction]
(
  @string nvarchar(max),
  @delimiter nvarchar(5)
) RETURNS @t TABLE
(
  val nvarchar(500)
)
AS
BEGIN
  declare @xml xml
  set @xml = N'<root><r>' + replace(@string,@delimiter,'</r><r>') + '</r></root>'

  insert into @t(val)
  select 
    r.value('.','varchar(500)') as item
  from @xml.nodes('//root/r') as records(r)

  RETURN
END
但出于某种原因,在我选择查看之后:

select * from SearchedUserItems
where itemid in('124125125','125125125')
记录还在那里


我做错了什么?有人能帮我吗?

如注释中所述,另一个选项是使用表类型参数。这就提出了一些假设,但一些评论认为,这些假设应该会让您走上正确的道路:

CREATE TYPE dbo.IDList AS TABLE (ItemID int NOT NULL); --Assumed int datatype;
GO

ALTER PROC dbo.zsp_deleteEndedItems @ItemIDList dbo.IDList READONLY AS

    DELETE SUI
    FROM dbo.SearchedUserItems SUI
         JOIN @ItemIDList IDL ON SUI.ItemID = IDL.ItemID;
GO

--Example of usage

DECLARE @ItemList dbo.IDList;

INSERT INTO @ItemList
VALUES(123456),(123457),(123458);

EXEC dbo.zsp_deleteEndedItems @ItemList;

GO
关于内联表值函数的问题,下面是一个这样的示例,我很快写了这个示例,它提供了下一个1000个数字的计数表:

CREATE FUNCTION dbo.NextThousand (@Start int)
RETURNS TABLE
AS RETURN

    WITH N AS(
        SELECT N
        FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL)) N(N)
    )
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -1 + @Start AS I
    FROM N N1 --10
         CROSS JOIN N N2 --100
         CROSS JOIN N N3; --1,000
GO

iTVF的重要之处在于它只有一条语句,那就是RETURN语句。将表声明为返回类型变量,将数据插入其中,并返回该变量,将其转换为多行TVF;执行速度要慢得多。

我强烈建议将多行TVF重写为内联TVF;这样做很可能会提高性能。您的目标是哪个SQL Server版本?每一个受支持的版本,甚至2005-2008 R2版本都有更好的选择。如果你用C,那就更容易了。使用存储过程不会获得任何好处。如果要删除很多行,请执行一个普通的旧SQL字符串,该字符串包含delete TARGETABLE where ID in。。。。。。把身份证传进去。您也可以使用像Dapper这样的微型ORM来完成这项工作,例如connection.executeElete表X,其中@ids,new{ids=thatidleist};中的ID;。当您删除多个实体时,完整的ORM-like EF将生成一个类似的查询。我强烈建议您停止摆弄分隔字符串,并使用表值参数将要删除的ID从c传递到SQL Server。在纯SQL解决方案中,您可以传递表值参数并与其联接。如果您有很多条目,那么将它们写入索引临时表并与之连接会更快。使用例如SqlBulkInsert可以插入数千个IDquickly@Larnu你能给我举个例子吗=嘿谢谢你的快速回复!我该如何从C中调用此方法?@User987文档告诉您需要了解的所有信息: