2016-04-29 13 views
2

SQL ServerデータベースにXMLファイルデータをアップロードしています。同じファイルを2回インポートすると、すべてのデータ行が重複してしまいます。SQLサーバーにデータをインポート中に重複をスキップ

重複した行が削除されたときに私はDISTINCTを使用しようとしましたが、インポートするときにデータ行はまだ複製されています。

DISTINCTメソッドを使用してSQL Serverデータベースにデータをインポートする際に重複をスキップする方法はありますか。

マイテーブル:

Create table HallSeat 
(
    HallGroupID int, 
    ShowSeatID int, 
    Color nvarchar(15), 
    Price int, 
    SeatRow int,  
    SeatNumber int, 
    IsReserved bit 
) 

SQL DISTINCT声明:

SELECT DISTINCT * 
INTO tempdb.dbo.tmpTable 
FROM HallSeat 

DELETE FROM HallSeat 

INSERT INTO HallSeat 
    SELECT * 
    FROM tempdb.dbo.tmpTable 

DROP TABLE tempdb.dbo.tmpTable 
+0

インポートするサンプルデータを入力します。 –

+0

インポートしたXMLファイルをhttp://s000.tinyupload.com/index.php?file_id=00087989931748177566 – Paulius

答えて

2

あなたがこれを行うには、T-SQLのMERGE文を使用することができます。 HallSeatテーブルにインポートされている行セットと一致します。行が存在しない場合は、新しい行が挿入されます。行が存在し、違いがある場合は、行を更新できます。最初にこのことを実証するためにhttps://msdn.microsoft.com/en-GB/library/bb510625.aspx

、 -

(あなたが削除アクションを行うにはしたくないかもしれませんが、私は完全を期すため、それが含まれている。)

参照オンラインブック> MERGE(のTransact-SQL) 2つのテーブルを作成します。

CREATE TABLE dbo.HallSeat 
(
    HallGroupID int NOT NULL, 
    ShowSeatID int NOT NULL, 
    Color nvarchar(15) NOT NULL, 
    Price int NOT NULL, 
    SeatRow int NOT NULL, 
    SeatNumber int NOT NULL, 
    IsReserved bit NOT NULL, 
    CONSTRAINT PK_HallSeat PRIMARY KEY CLUSTERED (HallGroupID, ShowSeatID) 
); 

CREATE TABLE dbo.ImportHallSeat 
(
    HallGroupID int NOT NULL, 
    ShowSeatID int NOT NULL, 
    Color nvarchar(15) NOT NULL, 
    Price int NOT NULL, 
    SeatRow int NOT NULL, 
    SeatNumber int NOT NULL, 
    IsReserved bit NOT NULL, 
    CONSTRAINT PK_ImportHallSeat PRIMARY KEY CLUSTERED (HallGroupID, ShowSeatID) 
); 

その後ImportHallSeatテーブルにXMLデータファイルをインポートします。

-- Read the XML data file to be imported 
DECLARE @xml xml; 
SELECT @xml = x.a 
    FROM OPENROWSET(BULK 'F:\Work\Data.xml', SINGLE_BLOB) AS x(a); 

TRUNCATE TABLE dbo.ImportHallSeat; 

INSERT INTO dbo.ImportHallSeat(HallGroupID, ShowSeatID, Color, Price, SeatRow, SeatNumber, IsReserved) 
    SELECT T.C.value('HallGroupID[1]', 'int') AS 'HallGroupID', 
      T.C.value('ShowSeatID[1]', 'int') AS 'ShowSeatID', 
      T.C.value('Color[1]', 'nvarchar(15)') AS 'Color', 
      T.C.value('Price[1]', 'money') AS 'Price', 
      T.C.value('SeatRow[1]', 'int') AS 'SeatRow', 
      T.C.value('SeatNumber[1]', 'int') AS 'SeatNumber', 
      T.C.value('IsReserved[1]', 'bit') AS 'IsReserved' 
     FROM @xml.nodes(N'/Filharmonija/Hall/HallGroup/HallSeat') as T(C); 

その後、我々は、インポートされたデータとHallSeatテーブルを更新することができます。

MERGE 
    INTO dbo.HallSeat AS H 
    USING dbo.ImportHallSeat AS I 
    ON I.HallGroupID = H.HallGroupID AND I.ShowSeatID = H.ShowSeatID 
    WHEN MATCHED AND H.Color <> I.Color AND H.Price <> I.Price 
     THEN UPDATE SET H.Color = I.Color, H.Price = I.Price 
    WHEN NOT MATCHED BY TARGET 
     THEN INSERT (HallGroupID, ShowSeatID, Color, Price, SeatRow, SeatNumber, IsReserved) 
      VALUES (I.HallGroupID, I.ShowSeatID, I.Color, I.Price, I.SeatRow, I.SeatNumber, I.IsReserved) 
    WHEN NOT MATCHED BY SOURCE 
     THEN DELETE; 

が持つデータを表示しますHallSeatテーブルにインポートされました:

SELECT * 
    FROM dbo.HallSeat; 

enter image description here

+0

アップロードしました。ありがとうございますrichard345!それは完璧な答えでした。 – Paulius

関連する問題