tsql循环问题,正在插入重复记录

时间:2013-11-06 00:24:22

标签: sql-server tsql

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

3 个答案:

答案 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)