我将分隔的字符串传递给存储过程,该存储过程在进入分隔符时将值输入到声明的表中,
这是我的存储过程。
Alter PROCEDURE s_BulkDeleteTest
(
@IDString VarChar(200)
)
AS
-- Creating Variables
DECLARE @numberLength int
DECLARE @numberCount int
DECLARE @TheIDs VarChar(200)
DECLARE @sTemp VarChar(100) -- to hold single characters
-- Creating a temp table
DECLARE @T TABLE
(
TheIDs VarChar(500)
)
--Initializing Variables for counting
SET @numberLength = LEN (@IDString)
SET @numberCount = 1
SET @TheIDs = ''
--Start looping through the keyword ids
WHILE (@numberCount <= @numberLength)
BEGIN
SET @sTemp = SUBSTRING (@IDString, @numberCount, 1)
IF (@sTemp = ',')
BEGIN
INSERT @T(TheIDs) VALUES (@TheIDs)
SET @TheIDs = ''
END
IF (@sTemp <> ',')
BEGIN
SET @TheIDs = @TheIDs + @sTemp
END
SET @numberCount = @numberCount + 1
END
这一切都适用于将值添加到@T表,但后来我添加了这个..
delete from [Subjects]
where (select TheIDs from @T) = SubjectID
在声明的表@T中有多个值时出错。 所以我想知道如何使用@T中的值并从我的Subjects表中删除所有这些ID。
答案 0 :(得分:2)
如果使用IN运算符TheIDs
具有任何空值,则将删除不正常的行。我建议使用这样的EXISTS运算符...
DELETE FROM [Subjects]
WHERE EXISTS
(SELECT 1
FROM @T
WHERE [Subjects].SubjectId = TheIDs)
答案 1 :(得分:1)
您需要使用in
:
delete from [Subjects]
where SubjectId in (select TheIDs from @T);
具有多行的结果集不能等于单个值。
编辑:
表达式(select TheIds from @T)
返回一组值。 =
运算符用于标量值,而不是集合。因此,它通常不适用于此构造。 in
运算符将标量与集合进行比较。所以它确实有用。
有一个例外。当子查询返回一行和一列时,它将转换为标量值。因此,如果返回了一行,或者如果强制使用一行,则表达式将起作用,如:
where SubjectId = (select top 1 TheIDs from @T);
当然,in
也适用于这种情况。