2014-11-24 182 views
0

我有一個存儲過程,我將一個文檔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

回答

0

不知道你在@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

0

等於@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