2

私はテーブルを持っていますtblCollectionGameList

CREATE TABLE dbo.tblCollectionGameList
(
    ListID smallint IDENTITY(0,1) NOT NULL,
    CollectionID smallint NOT NULL,
    IncludedSectionID smallint NOT NULL,
    CONSTRAINT PK_CollectionGameList_ListID PRIMARY KEY CLUSTERED (ListID ASC),
    CONSTRAINT FK_CollectionGameList_SectionInfo FOREIGN KEY (CollectionID) REFERENCES dbo.tblSectionInfo (SectionID),
    CONSTRAINT FK_CollectionGameList_SectionInfo2 FOREIGN KEY (IncludedSectionID) REFERENCES dbo.tblSectionInfo (SectionID)
)

MERGEWeb サイトから値の XML セットを渡した後、次のコマンドを実行します。

SELECT 
   CAST(colx.query('data(CollectionID) ') AS varchar) AS CollectionID,
   CAST(colx.query('data(IncludedSectionID) ') AS varchar) AS IncludedSectionID
INTO #TEMPtblCollectionGameList
FROM @XMLTable.nodes('DocumentElement/XMLTable') AS Tabx(Colx)

MERGE dbo.tblCollectionGameList AS t
USING #TEMPtblCollectionGameList AS s
ON (t.CollectionID = s.CollectionID AND t.IncludedSectionID= s.IncludedSectionID)
WHEN NOT MATCHED BY TARGET
    THEN
        INSERT (CollectionID, IncludedSectionID)
        VALUES (s.CollectionID, s.IncludedSectionID)
WHEN NOT MATCHED BY SOURCE
    THEN
        DELETE
;

これは正しく機能していません。テーブルに既存のデータ セットがある場合:

ListID  CollectionID    IncludedSectionID
34      86              0
35      86              1

CollecitonIDそして、古いデータを削除して新しいデータを配置する別のコレクションのWebページから新しいデータを配置しようとしました:

ListID  CollectionID    IncludedSectionID
38      92              10
39      92              11

Web ページが更新のために渡すMERGE以外のアイテムに影響を与えているコードの何が問題になっていますか?CollectionID

4

2 に答える 2

0

WHEN NOT MATCHED BY SOURCE句に条件を追加できます。

merge dbo.tblCollectionGameList as T
using #TEMPtblCollectionGameList as S
on S.CollectionID = T.CollectionID and
   S.IncludedSectionID = T.IncludedSectionID
when not matched by target
  then
    insert(CollectionID, IncludedSectionID)
      values(S.CollectionID, S.IncludedSectionID)
when not matched by source and 
     T.CollectionID in (select S.CollectionID
                        from #TEMPtblCollectionGameList as S)
  then
    delete
;
于 2012-10-10T13:06:51.580 に答える
0

解決策は、以下を追加することでした。

WITH tblCGL AS
(
    SELECT ListID, CollectionID, IncludedSectionID
    FROM dbo.tblCollectionGameList AS CGL
    WHERE EXISTS
    (
        SELECT CollectionID, IncludedSectionID
        FROM #TEMPtblCollectionGameList AS TempCGL
        WHERE CGL.CollectionID = TempCGL.CollectionID
    )
)

これは、SQLteam.com の人たちの助けによって集められました。

于 2012-10-10T21:29:02.377 に答える