SQL Server 2005-Implementierung von MySQL REPLACE INTO?

Translate

MySQL hat dies unglaublich nützlich und doch richtigREPLACE INTOSQL-Befehl.

Kann dies in SQL Server 2005 einfach emuliert werden?

Starten einer neuen Transaktion, Ausführen von aSelect()und dann auch nichtUPDATEoderINSERTundCOMMITist immer ein bisschen mühsam, besonders wenn man es in der Anwendung macht und daher immer 2 Versionen der Anweisung behält.

Ich frage mich, ob es eine einfache undUniversal-Wie kann eine solche Funktion in SQL Server 2005 implementiert werden?

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Das nervt mich an MSSQL (schimpfe auf meinem Blog). Ich wünsche MSSQL unterstütztupsert.

Der Code von @ Dillie-O ist ein guter Weg in älteren SQL-Versionen (+1 Stimmen), aber es handelt sich im Grunde immer noch um zwei E / A-Operationen (dieexistsund dann dieupdateoderinsert)

Es gibt einen etwas besseren Wegdieser Beitrag, Grundsätzlich:

--try an update
update tablename 
set field1 = 'new value',
    field2 = 'different value',
    ...
where idfield = 7

--insert if failed
if @@rowcount = 0 and @@error = 0
    insert into tablename 
           ( idfield, field1, field2, ... )
    values ( 7, 'value one', 'another value', ... )

Dies reduziert es auf eine E / A-Operation, wenn es sich um ein Update handelt, oder auf zwei, wenn es sich um eine Einfügung handelt.

MS Sql2008 stellt vormergeaus dem SQL: 2003-Standard:

merge tablename as target
using (values ('new value', 'different value'))
    as source (field1, field2)
    on target.idfield = 7
when matched then
    update
    set field1 = source.field1,
        field2 = source.field2,
        ...
when not matched then
    insert ( idfield, field1, field2, ... )
    values ( 7,  source.field1, source.field2, ... )

Jetzt ist es wirklich nur eine E / A-Operation, aber schrecklicher Code :-(

Quelle
Translate

Die gesuchte Funktionalität wird traditionell als UPSERT bezeichnet. Wenn Sie zumindest wissen, wie es heißt, können Sie leichter finden, wonach Sie suchen.

Ich glaube nicht, dass SQL Server 2005 großartige Möglichkeiten bietet, dies zu tun. 2008 führt die MERGE-Anweisung ein, mit der dies wie folgt erreicht werden kann:http://www.databasejournal.com/features/mssql/article.php/3739131oderhttp://blogs.conchango.com/davidportas/archive/2007/11/14/SQL-Server-2008-MERGE.aspx

Merge war in der Beta von 2005 verfügbar, wurde jedoch in der endgültigen Version entfernt.

Quelle
Translate

Was der Upsert / Merge tut, hat etwas mit der Wirkung von ...

IF EXISTS (SELECT * FROM [Table] WHERE Id = X)
   UPDATE [Table] SET...
ELSE
   INSERT INTO [Table]

Hoffentlich kann die Kombination dieser Artikel und dieses Pseudocodes die Dinge in Bewegung bringen.

Quelle
Translate

Ich schrieb eineBlog-Beitrag zu diesem Thema.

Das Fazit ist, dass Sie günstige Updates wünschen ... und gleichzeitig sicher sein möchten. Versuchen:

update t
set hitCount = hitCount + 1
where pk = @id

if @@rowcount < 1 
begin 
   begin tran
      update t with (serializable)
      set hitCount = hitCount + 1
      where pk = @id
      if @@rowcount = 0
      begin
         insert t (pk, hitCount)
         values (@id,1)
      end
   commit tran
end

Auf diese Weise haben Sie 1 Operation für Aktualisierungen und maximal 3 Operationen für Einfügungen. Wenn Sie also allgemein aktualisieren, ist dies eine sichere, günstige Option.

Ich würde auch sehr vorsichtig sein, nichts zu verwenden, was für die gleichzeitige Verwendung unsicher ist. Es ist wirklich einfach, Verstöße gegen Primärschlüssel oder doppelte Zeilen in der Produktion zu bekommen.

Quelle