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 を作成しました。

値が利用できない場合、レコードが挿入されます。

問題: テーブルに存在しない IND、USA などの 2 つの値を XML から送信すると、重複したレコードがテーブルに挿入されます。

自分のコードでどのような間違いを犯したか誰にもわかりますか?

修正後..

   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

カーソルを使わないほうがいいと思います。一時テーブルとタグ テーブルの間で外部結合を実行し、タグ エントリが null である場合にのみ挿入を実行するのはどうですか?

カーソルを使用する必要があることはめったにありません。

于 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 に答える