2016-12-01 2 views
0

Ich möchte sicherstellen, dass Referenztabellen ausgefüllt werden, bevor Tests mit einer Datenbank durchgeführt werden. Die spezifischen Daten, die ich verwenden möchte, sind möglicherweise bereits in der Testdatenbank enthalten, daher möchte ich eine MERGE (auch bekannt als UPSERT) durchführen, die die Daten einfügen würde, wenn sie nicht bereits in der Tabelle vorhanden und aktualisiert wäre es ist, wenn es war.Wie kann ich eine MERGE in DbFit durchführen?

Von dem, was ich von Googling sehen kann, scheint DbFit den MERGE-Befehl nicht zu unterstützen und unterstützt auch nicht das Ausführen von SQL aus einer externen SQL-Skriptdatei (Plan B war das Erstellen der MERGE in einer SQL-Skriptdatei) , dann lade die Datei und starte sie in DbFit).

Gibt es eine direkte Möglichkeit, eine MERGE in DbFit durchzuführen, oder muss ich dafür eine spezielle Fixture-Klasse erstellen?

Antwort

0

Ich habe herausgefunden, wie man es mit den Standardbefehlen von FitSharps Version von DbFit macht.

Dieses Beispiel wird mit einer SQL Server Datenbank ausgeführt. Oracle hat eine ähnliche Syntax für seine MERGE-Anweisung, obwohl ich nicht weiß, wie es mit temporären Tabellen umgeht. MySQL hat keine MERGE-Anweisung; Es hat einen Nicht-Standard-Befehl, der dasselbe erreicht. Es unterstützt auch temporäre Tabellen, aber ich bin nicht vertraut mit der Syntax für temporäre Tabellen MySql.

Hier ist die Definition einer Zieltabelle Ich möchte Daten in fusionieren:

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

Hier ist der DbFit Flow-Modus-Seite, die Daten in sie fusionieren:

!| 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   | 

Zunächst wird eine temporäre Tabelle ist erstellt, um als Datenquelle für die MERGE zu dienen. Die zu meldenden Daten werden in die temporäre Tabelle eingefügt, und dann wird die MERGE-Anweisung ausgeführt. Der Query-Befehl am Ende wird für MERGE nicht benötigt, er wurde nur hinzugefügt, um zu überprüfen, ob die Zieltabelle korrekt aktualisiert wurde.

Beachten Sie, dass der Befehl Einfügen einen dreiteiligen Namen für die temporäre Tabelle mindestens in SQL Server verwenden muss.

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' 

Funktion Die OBJECT_ID wird die Objekt-ID einer temporären Tabelle nur zurück, wenn: Wenn der Befehl Einfügen gegen SQL Server ausgeführt wird, hinter den Kulissen es sys.columns fragt Spalteninformationen über den Tisch zu bekommen ist in eingefügt Der Tabellenname wird als dreiteiliger Name angegeben. Dies liegt daran, dass SQL Server immer temporäre Tabellen in der Tempdb-Datenbank erstellt und nicht die Datenbank, in der die temporäre Tabelle verwendet wird. Die OBJECT_ID-Funktion wird die Metadaten für die temporäre Tabelle nicht finden, es sei denn, es wird aufgefordert, in der Tempdb-Datenbank nach es zu suchen.

Verwandte Themen