2016-12-01 25 views
0

データベースに対してテストを実行する前に、参照テーブルにデータが入力されていることを確認したいと思います。私が使用したいと思う特定のデータは、すでにテストデータベースに入っているかもしれないし、そうでないかもしれないので、MERGE(UPSERTとも呼ばれる)を実行したい。もしあれば。DbFitでMERGEを実行するにはどうすればよいですか?

私はグーグルリングから見ることができますから、DbFitはMERGEコマンドをサポートしていないようで、外部SQLスクリプトファイルから読み込まれたSQLの実行もサポートしていません(計画BはMERGEをSQLスクリプトファイル、ファイルをロードしてDbFitで実行します)。

DbFitでMERGEを実行する方法はありますか、それを行うには特別なフィクスチャクラスを作成する必要がありますか?

答えて

0

FitSharpのDbFitバージョンの標準コマンドを使用してそれを行う方法を理解しました。

この例は、SQL Serverのデータベースに対して実行されています。 OracleはMERGE文の構文も同様ですが、一時表の処理方法はわかりません。 MySQLにはMERGE文がありません。それは同じことを達成する非標準的なコマンドを持っています。また、一時テーブルをサポートしていますが、私はMySqlテンポラリテーブルの構文に慣れていません。

ここで私はにデータをマージしたいターゲット表の定義の:

CREATE TABLE Student 
(
    [Name] NVARCHAR(200), 
    DateOfBirth DATETIME, 
    Notes NVARCHAR(1000) 
); 

がここにそれにデータをマージしますDbFitフローモードのページです:

!| Execute | CREATE TABLE #MergeSource ([Name] NVARCHAR(200), DateOfBirth DATETIME, Notes NVARCHAR(1000)); | 

!| Insert | tempdb.dbo.#MergeSource | 
| Name  | DateOfBirth | Notes    | 
| Jane Smith | 1997-09-24 | These are some notes | 
| John Doe | 2000-04-06 | Other notes   | 

!| Execute | !- 
MERGE INTO Student AS target 
USING 
    (
     SELECT [Name], [DateOfBirth], [Notes] 
     FROM #MergeSource 
    ) AS source 
ON target.[Name] = source.[Name] 
WHEN MATCHED THEN 
    UPDATE 
    SET [DateOfBirth] = source.[DateOfBirth], 
     [Notes] = source.[Notes] 
WHEN NOT MATCHED BY TARGET THEN 
    INSERT ([Name], [DateOfBirth], [Notes]) 
    VALUES (source.[Name], source.[DateOfBirth], source.[Notes]); 
    -! | 

!| Query | SELECT [Name], DateOfBirth, Notes FROM Student; | 
| Name  | DateOfBirth | Notes    | 
| Jane Smith | 1997-09-24 | These are some notes | 
| John Doe | 2000-04-06 | Other notes   | 

まず一時テーブルがありますMERGEのデータソースとして機能するように作成されています。マージするデータが一時表に挿入され、MERGE文が実行されます。最後のQueryコマンドはMERGEでは必要なく、対象テーブルが正しく更新されたことを確認するために追加されました。

メモInsertコマンドは、少なくともSQL Serverではtempテーブルの3つの部分からなる名前を使用する必要があります。 Insertコマンドは、SQL Serverに対して実行されると、それが挿入されているテーブルについての列情報を取得するためにsys.columnsを照会舞台裏:場合

exec sp_executesql N'select c.[name], TYPE_NAME(c.system_type_id) as [Type], c.max_length, 
    0 As is_output, 0 As is_cursor_ref, c.precision, c.scale 
    from tempdb. sys.columns c 
    where c.object_id = OBJECT_ID(@objname) 
    order by column_id', 
     N'@objname nvarchar(23)', 
     @objname=N'tempdb.dbo.#MergeSource' 

OBJECT_ID機能は一時テーブルのオブジェクトIDを返します。テーブル名は3つの部分からなる名前で指定されます。これは、SQL Serverはtempテーブルが作成されるデータベースではなく、tempdbデータベースに常にtempテーブルを作成するためです。 OBJECT_ID関数は、tempdbデータベースでそのテーブルを検索するよう指示されていない限り、tempテーブルのメタデータを検出しません。

関連する問題