如何使用声明的表值从表中删除?

时间:2014-03-22 16:13:05

标签: sql sql-server stored-procedures

我将分隔的字符串传递给存储过程,该存储过程在进入分隔符时将值输入到声明的表中,

这是我的存储过程。

 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。

2 个答案:

答案 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也适用于这种情况。