SQL Server 2005 Implementierung von MySQL INTO ERSETZEN?

stimmen
73

MySQL hat diese unglaublich nützlich noch properitary REPLACE INTOSQL - Befehl.

Kann dies leicht in SQL Server 2005 emuliert werden?

Eine neue Transaktion starten, eine tun Select()und dann entweder UPDATEoder INSERT IGNORE und COMMITist immer ein bisschen wie ein Schmerz, vor allem , wenn es in der Anwendung zu tun und daher immer zwei Versionen der Aussage zu halten.

Ich frage mich , ob es eine einfache und universelle Art und Weise , eine solche Funktion in SQL Server 2005 zu implementieren?

Veröffentlicht am 01/08/2008 um 23:13
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
53

Dies ist etwas , das mich über MSSQL (ärgert rant auf meinem Blog ). Ich wünsche MSSQL unterstützt upsert.

@ Dillie-O - Code ist eine gute Möglichkeit , in älteren Versionen von SQL (1 Stimme), aber es ist nach wie vor im Wesentlichen zwei IO - Operationen (die existsund dann der updateoder insert)

Es gibt eine etwas bessere Art und Weise auf diesem Beitrag , im Grunde:

--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 sie auf eine IO-Operationen, wenn es ein Update, oder zwei, wenn ein Einsatz.

MS SQL2008 führt mergevon der 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 ein IO-Betrieb, aber schrecklich Code :-(

Beantwortet am 15/08/2008 um 13:50
quelle vom benutzer

stimmen
20

Die Funktionalität Sie suchen ist traditionell ein UPSERT genannt. Zumindest wissen, was es helfen genannt könnten Sie finden, was Sie suchen.

Ich glaube nicht , SQL Server 2005 hat keine großen Möglichkeiten dies zu tun. 2008 führt die MERGE - Anweisung , die verwendet werden kann , um dies zu erreichen , wie in: http://www.databasejournal.com/features/mssql/article.php/3739131 oder http://blogs.conchango.com/davidportas/archive/ 2007/11 / 14 / SQL-Server-2008-MERGE.aspx

Merge war in der Beta-Version von 2005 zur Verfügung, aber sie entfernte es in der endgültigen Version heraus.

Beantwortet am 01/08/2008 um 23:22
quelle vom benutzer

stimmen
15

Was die Upsert / merge macht, ist etwas in der Art von ...

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

So hoffnungsvoll die Kombination dieser Artikel und dieser Pseudo-Code kann etwas bewegen.

Beantwortet am 01/08/2008 um 23:31
quelle vom benutzer

stimmen
9

Ich schrieb einen Blog - Beitrag zu diesem Thema .

Unterm Strich ist, dass, wenn Sie billige Updates wollen ... und Sie wollen für die gleichzeitige Verwendung sicher sein. 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 Betrieb für Updates und ein Maximum von drei Operationen für Einsätze. wenn Sie so sind dies in der Regel zu aktualisieren ist eine sichere, billige Option.

Ich würde auch sehr vorsichtig sein, nicht alles zu verwenden, die für die gleichzeitige Verwendung unsicher ist. Es ist wirklich einfach, Primärschlüssel Verletzungen zu bekommen oder doppelte Zeilen in der Produktion.

Beantwortet am 21/09/2008 um 23:05
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more