DECLARE @tag VARCHAR(MAX)
DECLARE @TagID as INT;
DECLARE tag_cursor CURSOR
FOR
SELECT tagname FROM #temptag
FOR READ ONLY
OPEN tag_cursor
FETCH NEXT FROM tag_cursor INTO @tag
WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS (SELECT * FROM Tag WHERE TagName=@tag)
BEGIN
SELECT @TagID = TagID FROM Tag WHERE TagName = @tag
Insert into NoteTags(NoteID,TagID) values (@NoteID,@TagID)
END
ELSE
BEGIN
INSERT INTO Tag
SELECT @tag FROM #temptag
SELECT @TagID = SCOPE_IDENTITY();
Insert into NoteTags(NoteID,TagID) values (@NoteID,@TagID)
END
FETCH NEXT FROM tag_cursor INTO @tag
END
CLOSE tag_cursor
DEALLOCATE tag_cursor
我使用XML将参数传递给过程,我创建了一个临时表,并将所有值从XML存储到其中。然后我写了Cursor来检查表中是否已存在值。
如果值不可用,将插入记录。
问题:如果我从XML发送两个值,说IND,USA,我的表中不存在,则会在表中插入重复记录。
任何人都可以告诉我用我的代码犯了什么错误。
修改后..
BEGIN
INSERT INTO Tag(TagName) values(@tag);
SELECT @TagID = IDENT_CURRENT('Tag');
Insert into NoteTags(NoteID,TagID) values (@NoteID,@TagID)
END
答案 0 :(得分:1)
这是避免光标的基于集合的答案: -
insert into tag (tagname)
select tt.tagname
from #temptag tt
where not exists(
select *
from tag t
where t.tagname=tt.tagname
)
insert into notetags (noteid,tagid)
select @noteid,t.tagid
from tag t
where exists(
select *
from #temptag tt
where tt.tagname=t.tagname
)
and not exists(
select *
from notetags nt
where nt.noteid=@noteid
and nt.tagid=t.tagid
)
您的代码中没有任何线索可以设置@noteid。
答案 1 :(得分:0)
我认为更好的想法是不使用光标。如何在临时表和Tag表之间进行外连接,只进行标签条目为空的插入?
我发现您很少需要使用光标。
答案 2 :(得分:0)
此代码导致您的问题: -
INSERT INTO Tag
SELECT @tag FROM #temptag
您已经拥有@tag的值 - 但是select
正在为#temptag
中的每一行重复它,因此您最终会在标记中找到重复的行
删除select
并将insert
更改为: -
insert into tag (TagName) values (@tag)