0
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
4

3 回答 3

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 的线索。

于 2013-11-06T02:28:30.120 回答
0

我认为更好的主意是不使用光标。如何在临时表和 Tag 表之间进行外部连接,并且只在标记条目为空的情况下进行插入?

我发现您很少需要使用光标。

于 2013-11-06T00:53:26.697 回答
0

此代码导致您的问题:-

    INSERT INTO Tag
    SELECT @tag FROM #temptag

您已经拥有 @tag 的值 - 但是select会为每一行复制它,#temptag因此您最终会在 Tag 中得到重复的行

删除并将其select更改insert为:-

    insert into tag (TagName) values (@tag)
于 2013-11-06T00:53:39.067 回答