从临时表中删除记录时将被删除的所有记录

问题描述:

我有一个存储过程,我将一个文档ID字符串传递给它,并且它应该删除其中的roleID = @roleID的documentID,但相反它会删除所有记录根据该角色ID和所有我想要做的就是基础上删除该角色ID从表中documentIDs从临时表中删除记录时将被删除的所有记录

我的SP是

ALTER PROCEDURE sp_RemoveDocumentIDsFromRole 
(
@roleID int, 
@group_name varchar(50), 
@DocumentIDString varchar(500), 
@group_display_name varchar(50) 
) 
as 
UPDATE [master_groups] 
set group_name = @group_name, @group_display_name = @group_display_name 
where roleID = @roleID 

-- Creating Variables 
DECLARE @numberLength int 
DECLARE @numberCount int 
DECLARE @TheDocumentIDs VarChar(500) 

DECLARE @sTemp VarChar(100) -- to hold single characters 

    -- Creating a temp table 
DECLARE @T TABLE 
(
    TheDocumentIDs VarChar(500) 
) 
--Initializing Variables for counting 
SET @numberLength = LEN (@DocumentIDString) 
SET @numberCount = 1 
SET @TheDocumentIDs = '' 

--Start looping through the keyword ids 
WHILE (@numberCount <= @numberLength) 

BEGIN 
SET @sTemp = SUBSTRING (@DocumentIDString, @numberCount, 1) 
    IF (@sTemp = ',') 
     BEGIN 
      INSERT @T(TheDocumentIDs) VALUES (@TheDocumentIDs) 
      SET @TheDocumentIDs = '' 
     END 
    IF (@sTemp <> ',') 
     BEGIN 
      SET @TheDocumentIDs = @TheDocumentIDs + @sTemp 
     END 
     SET @numberCount = @numberCount + 1 
END 

declare @rLevel int 
set @rLevel = 0 

delete from [master_group_document_relations] where exists(select documentID = @TheDocumentIDs from @T) and roleID = @roleID 

UPDATE:样本数据 Sample Data

+0

@ EmmadKareem,我很确定它的正确性,它从临时表中选择id并且应该这样做删除它们。我使用相同的方式插入临时表的ID到表 – Chris 2014-11-24 06:54:43

+0

一个问题和一个建议。问:你能否提供关于输入DocumentIDString的例子,以及关于表T的内容的处理?建议:避免使用“sp_”作为存储过程的前缀。 “sp_”也被用作Microsoft SQL Server内置存储过程的前缀,并且这是一个禁止(如果感兴趣,可以通过在联机丛书上搜索来确认这一点)。 – 2014-11-24 07:01:07

+0

@EduardUta,是的,我犯了与sp_前缀,我已经意识到这是一个禁止,但它的测试,直到我准备清理代码.. DocumentIDString看起来像123,234,321等。 .. – Chris 2014-11-24 07:06:12

不知道你在@TheDocumentIDs,但我想它应该为你工作。

所有提到@克里斯首先,你应该检查放置条件where子句和documentIds是ID的名单应该与用于条件,而不是平等的,这就是为什么你需要或使用sp_executesql的或填写id到临时表

  EXECUTE sp_executesql 
      N'delete from [master_group_document_relations] 
      where documentID IN (@TheDocumentIDs) 
       and roleID = @roleID', 
      N'@TheDocumentIDs varchar(500), @roleID int', 
      @DocumentIDString, 
      @roleID; 

,或者如果你想删除的master_group_document_relations记录,其中其documentID是在@troleIDTheDocumentIDs试试这个

  delete from [master_group_document_relations] 
      where documentID IN (SELECT TheDocumentIDs FROM @T) 
       and roleID = @roleID 
+0

我也试过这个,应该删除的ID仍然存在 – Chris 2014-11-24 07:12:58

+0

@Chris第二个查询怎么办? – hgulyan 2014-11-24 07:14:44

+0

对不起第二个查询不起作用,我不知道如何运行第一个查询 – Chris 2014-11-24 07:15:20

等于@roleID那就试试这个:

DELETE T1 
FROM [master_group_document_relations] AS T1 
WHERE EXISTS(SELECT 1 
       FROM @T AS T2 
       WHERE T1.documentID = T2.TheDocumentIDs) 
     AND roleID = @roleID 
+0

为无效的列名称引发错误T1.documentID – Chris 2014-11-24 07:12:30

+0

抱歉编辑了答案。我使用了同样的别名。 – 2014-11-24 07:13:15

+0

我试了一下,结果回来了,ID没有被删除。 – Chris 2014-11-24 07:14:42