none
SSISのタスクで重複主キーのデータのチェック方法 RRS feed

  • 質問

  • こんにちは。

     

    SSISのタスクを使って、フラットファイルにあるレコードをチェックしようと思っています。

    重複主キーのデータがあったら、エラーで終了させたいです。

     

    USE [TEST]
    GO

    /****** Object:  Table [dbo].[Table_2]    Script Date: 10/17/2008 16:17:14 ******/
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Table_2]') AND type in (N'U'))
    DROP TABLE [dbo].[Table_2]
    GO

    USE [TEST]
    GO

    /****** Object:  Table [dbo].[Table_2]    Script Date: 10/17/2008 16:17:14 ******/
    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Table_2]') AND type in (N'U'))
    BEGIN
    CREATE TABLE [dbo].[Table_2](
     [ID] [int] NOT NULL,
     [NAME] [nchar](10) COLLATE Japanese_CI_AS NULL,
     CONSTRAINT [PK_Table_2] PRIMARY KEY CLUSTERED
    (
     [ID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    END
    GO

     

    こう言ったテーブルがありますと…

    IDは主キーになります。

     

    Sample Data:

    /*******************

    1,AAAA

    2,BBBB

    3,CCCC

    4,DDDD

    2,EEEE

    *******************/

     

    このフラットファイルに

    /*******************

    1,AAAA

    2,BBBB

    3,CCCC

    4,DDDD

    2,EEEE

    *******************/

    2行目と5行目は同じ主キーになるため、DTSX実行するときに、キー違反のエラーになります。

     

    やりたいこと:

    データベースのテーブルに入れる前に、同じ重複した主キーデータはあるかどうか、一回チェックしたいです。あった場合、エラーを起こして、SSIS処理を終了させたいです。

     

    何かいい方法はありますでしょうか。SSIS勉強不足で、すみません。ご教授ください。

    よろしくお願いいたします。

     

     

     

     

    2008年10月17日 7:23

回答

  • SSISタスクで挿入しようとしているフラットファイルを一度作業用TBL(一時TBLで構わないのですが)へ登録後[EXISTS]関数を使用して重複をチェックする処理をSSISパッケージに前処理で追加するかSSIS呼び出し元に組み込む、というのはどうでしょうか。

     

    フラットファイルからデータをtblAに取り込んだとして

    SELECT count([NAME]) FROM [Table_2]
    WHERE EXISTS(SELECT * FROM tblA
                 WHERE [NAME] = [Table_2].[NAME])

     

    で結果が0件であれば挿入タスクを実行する、1件以上だったら実行しないという感じです。

    2008年10月18日 2:46

すべての返信

  • SSISタスクで挿入しようとしているフラットファイルを一度作業用TBL(一時TBLで構わないのですが)へ登録後[EXISTS]関数を使用して重複をチェックする処理をSSISパッケージに前処理で追加するかSSIS呼び出し元に組み込む、というのはどうでしょうか。

     

    フラットファイルからデータをtblAに取り込んだとして

    SELECT count([NAME]) FROM [Table_2]
    WHERE EXISTS(SELECT * FROM tblA
                 WHERE [NAME] = [Table_2].[NAME])

     

    で結果が0件であれば挿入タスクを実行する、1件以上だったら実行しないという感じです。

    2008年10月18日 2:46
  •  やっちん さんからの引用

    SSISタスクで挿入しようとしているフラットファイルを一度作業用TBL(一時TBLで構わないのですが)へ登録後[EXISTS]関数を使用して重複をチェックする処理をSSISパッケージに前処理で追加するかSSIS呼び出し元に組み込む、というのはどうでしょうか。

     

    フラットファイルからデータをtblAに取り込んだとして

    SELECT count([NAME]) FROM [Table_2]
    WHERE EXISTS(SELECT * FROM tblA
                 WHERE [NAME] = [Table_2].[NAME])

     

    で結果が0件であれば挿入タスクを実行する、1件以上だったら実行しないという感じです。

     

    こんばんは。

    回答有難う御座います。

    この方法確かに実現可能ですが、ただし、フラットファイルのレコード数が何百万行があった場合、プロセスのパフォーマンスが落ちます。

     

    SSIS内部で、フラットファイルを展開した後、このフラットファイルに対してSQL文実行可能でしょうか。ほかになんかいい方法はありますでしょうか。

     

    よろしくお願いいたします。

    2008年10月18日 11:41
  • 私もSSISの機能を十分理解できていないところがあるので、間違っているかもしれません。

    (もしかしたら「SQL Server Business Intelligence フォーラム」のほうが適切な回答を

    いただけるのかもしれません。)

     

    手元にSQL Server2005の環境がないのでうろ覚えなのですが、まずフラットファイルに対して

    SQL文が実行可能かどうか、については可能なはずです。「ファイル接続マネージャ」で

    対象のテキストファイルをデータソースとして作成し「SQL実行タスク」で接続先にそのデータ

    ソースを指定すればSQL文を実行できます。(・・・だったはずです。)

     

    ただ数百万行ということになるとファイル内のデータをSQL文で操作するのが効果があるのか

    どうか私も実践したことがないので分かりません。

     

    他にも方法はいくつかあると思いますがどれが最善か検証してみるのが良いかと思います。

    2008年10月19日 14:22
  • やっちんさん

    今晩は。

     

    私もいろいろ方法を試しているところです。

    何かいい情報や考え方がありましたら、ここに貼ってほしいです。

     

    いろいろ有難う御座います。お互いに頑張ります。

     

    一応、SQL Server Business Intelligence フォーラムにも貼ります。

    このレスを終了にします。

    2008年10月19日 14:37