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テーブルのメタデータを検出しません。