2016-04-25 8 views
-2

Ich brauche Datensätze in eine Tabelle einzufügen, die wie folgt aussieht:UPDATE oder INSERT in SQL Server mit spezifischen Anforderungen

CREATE TABLE [dbo].[ExamFees] 
(
    [ExamSeriesID] [int] NOT NULL, 
    [Region] [varchar](50) NOT NULL, 
    [Fee] [money] NOT NULL, 
    [DatetimeEntered] [datetime] NULL 
) 

jedoch bereits existiert dann DatetimeEntered getDate(), wenn ein Datensatz will ich nur .

Ich denke, ich muss Merge verwenden, aber ich bin mir nicht sicher, wie dies zu tun ist und mir wurde gesagt, dass ich Daten verlieren kann, wenn ich nicht weiß, was ich tue.

Einige Beispieldaten sind:

INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(553, 'Low', 10.00, GETDATE()) 
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(553, 'Lower mid', 20.00, GETDATE()) 
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(553, 'Upper mid', 30.00, GETDATE()) 
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(553, 'High', 40.00, GETDATE()) 
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(401, 'Low', 5.00, GETDATE()) 
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(401, 'Lower mid', 10.00, GETDATE()) 
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(401, 'Upper mid', 15.00, GETDATE()) 
INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(401, 'High', 20.00, GETDATE()) 

Es ist erwähnenswert, dass dies wird auch von einem C# Programm aufgerufen werden.

Die SQL wird in Massen erzeugt und zu einer String, etwa so:

string Region = "Low"; 

string ExamFeesTableName = "ExamFees"; 

sb.AppendLine("INSERT INTO " + ExamFeesTableName + "([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES(" + ExamSeriesID + ", '" + Region + "', " + Fee.ToString("0.00") + ", GETDATE())"); 

Kann jemand helfen?

+0

Ich vermute, dass Ihre Frage abgelehnt wurde, weil keine Forschungsarbeit gezeigt wurde. Ohne Kommentar werden wir es nie wissen ... Die Dokumentation zu MERGE finden Sie [hier] (https://msdn.microsoft.com/en-GB/library/bb510625.aspx). –

+0

Sie könnten immer zuerst eine Überprüfung durchführen, wenn es existiert (wählen Sie count (1) aus ExamFees wo blablabla) dann updaten sonst einfügen. Nicht die eleganteste Lösung, aber funktioniert und ist immer noch einfach zu lesen und zu pflegen – GuidoG

+0

Ich entschuldige mich dafür, als ob ich das nicht erforscht habe. Ich habe versucht, eine Zusammenführung durchzuführen, wie es auf der Oberfläche scheint, als die effizienteste Art, es zu tun, aber ich habe es nicht verstanden und wollte es nicht riskieren, es falsch zu machen. –

Antwort

1

Ich würde vorschlagen, eine ähnliche Strategie wie eine der folgenden Ansätze Kommissionierung:

Methode 1

IF EXISTS (SELECT * FROM ExamFees WHERE ExamSeriesID='553' and Region = 'Low') 
    UPDATE ExamFees SET DatetimeEntered = GETDATE() WHERE ExamSeriesID='553' and Region = 'Low' 
ELSE 
    INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES('553', 'Low', 10.00, GETDATE()) 

Methode 2

UPDATE ExamFees SET DatetimeEntered = GETDATE() WHERE ExamSeriesID='553' and Region = 'Low' 
IF @@ROWCOUNT=0 
     INSERT INTO ExamFees([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES('553', 'Low', 10.00, GETDATE()) 

Diese Beispiele basieren auf Ihren erste INSERT Anweisung, und muss für jeden wiederholt werden der INSERT-Anweisungen.

+0

Ich hatte gehofft zu lernen, wie man eine Zusammenführung macht, aber das funktioniert gut für mich. Ich habe eine InsertOrUpdate (..) C# -Methode basierend auf Das kann ich später ersetzen, wenn ich herausfinde, wie man dasselbe über eine MERGE macht: Danke Jacob, wenn ich herausfinde, wie man richtig fusioniert und es funktioniert, werde ich es als dritte Methode zu deiner Antwort hinzufügen. –

+0

@ Knickerless-Noggins Für eine MERGE-Anweisung, Sie etwas in der USING-Klausel benötigen. Zum Beispiel: MERGE INTO ExamFees ein weiter verwenden sometable b ON (a.ExamSeriesID = b.ExamSeriesID) WHEN MATCHED THEN UPDATE SET DatetimeEntered = GETDATE() WHEN NOT MATCHED THEN INSERT ([ExamSeriesID], [Region], [Fee], [DatetimeEntered]) VALUES ('553', 'Low', 10.00, GETDATE(); –