从临时表中删除记录时将被删除的所有记录
问题描述:
我有一个存储过程,我将一个文档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:样本数据
答
不知道你在@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
是在@t
和roleID
TheDocumentIDs
试试这个
delete from [master_group_document_relations]
where documentID IN (SELECT TheDocumentIDs FROM @T)
and roleID = @roleID
答
等于@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
@ EmmadKareem,我很确定它的正确性,它从临时表中选择id并且应该这样做删除它们。我使用相同的方式插入临时表的ID到表 – Chris 2014-11-24 06:54:43
一个问题和一个建议。问:你能否提供关于输入DocumentIDString的例子,以及关于表T的内容的处理?建议:避免使用“sp_”作为存储过程的前缀。 “sp_”也被用作Microsoft SQL Server内置存储过程的前缀,并且这是一个禁止(如果感兴趣,可以通过在联机丛书上搜索来确认这一点)。 – 2014-11-24 07:01:07
@EduardUta,是的,我犯了与sp_前缀,我已经意识到这是一个禁止,但它的测试,直到我准备清理代码.. DocumentIDString看起来像123,234,321等。 .. – Chris 2014-11-24 07:06:12