c# - 批量删除操作程序不起作用
问题描述
我有一个如下所示的存储过程:
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)
参数 IDList 传递如下:
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
这应该从 ID 下的“SearcheduserItems”表中删除所有项目:
124125125 and 125125125
但是由于某种原因,在我进行了选择以查看它之后:
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;执行速度要慢得多。
推荐阅读
- java - 字符的 utf16 转换为字节时有 2 个负数
- javascript - 如何遍历嵌套的 html 元素并用另一个 id 替换一个 id 号?
- python - 工作程序和驱动程序中的 Python 版本不同
- c++ - 使用 C++ 使用 GDK 获取像素 RGB 颜色空间
- ios - 关闭动作按钮项目上的动作按钮单击swift 4.2
- pandas - 如何插入空行并让数据从某个行号开始?
- java - 线程“main”java.lang.NumberFormatException 中的异常:对于输入字符串:“'\'All\''”
- android - 您的应用包含公开的 Google Cloud Platform (GCP) API 密钥。有关详细信息,请参阅此 Google 帮助中心文章
- tensorflow - InvalidArgumentError(参见上面的回溯):indices[47,6] = 24 is not in [0, 23)
- javascript - 使用`index.js`作为入口运行node.js服务器时,Module.compile出现语法错误“��c”