SQL Server 2005 végrehajtásához MySQL CSERE INTO?

szavazat
73

MySQL ez hihetetlenül hasznos tartalom properitary REPLACE INTOSQL parancs.

Akkor könnyen emulálni az SQL Server 2005-ben?

Kezdve egy új tranzakció, csinál egy Select()majd vagy UPDATEvagy INSERT IGNORE és COMMITmindig egy kicsit a fájdalom, különösen akkor, ha csinálja a kérelmet, és ezért mindig szem 2 változat a nyilatkozatot.

Kíváncsi vagyok, ha van egy egyszerű és univerzális módja a egy ilyen funkció az SQL Server 2005-ben?

A kérdést 01/08/2008 23:13
a forrás felhasználó
Más nyelveken...                            


4 válasz

szavazat
20

A funkcionalitás keres hagyományosan nevezik UPSERT. Atleast tudta, hogy hívják segíthet megtalálni, amit keres.

Nem hiszem, hogy az SQL Server 2005 van minden nagy módon teheti ezt meg. 2008 bemutatja a MERGE nyilatkozatot, hogy lehet használni, hogy ezt a bemutatott: http://www.databasejournal.com/features/mssql/article.php/3739131 vagy http://blogs.conchango.com/davidportas/archive/ 2007/11 / 14 / SQL-Server-2008-MERGE.aspx

Merge volt elérhető a béta 2005, de eltávolították ki a végleges kiadás.

Válaszolt 01/08/2008 23:22
a forrás felhasználó

szavazat
15

Mi a upsert / merge csinál van valami, hogy a hatás ...

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

Így remélhetőleg a kombináció az említett cikkek és a pszeudo-kód kaphat a dolgok.

Válaszolt 01/08/2008 23:31
a forrás felhasználó

szavazat
53

Ez olyasmi, ami bosszant engem MSSQL ( henceg a blogomban ). Bárcsak MSSQL támogatott upsert.

@ Dillie-O kód is egy jó módja a régebbi SQL változat (1 szavazás), de még mindig alapvetően két IO műveletek (a exists, majd a updatevagy insert)

Van egy kicsit jobb módon ezt a bejegyzést , alapvetően:

--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', ... )

Ez csökkenti azt az egyik IO műveleteket tartalmazza, ha ez egy frissítés, vagy kettő, ha egy betét.

MS SQL2008 bevezeti mergeaz SQL: 2003 szabvány:

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, ... )

Most már tényleg csak egy IO műveletet, de szörnyű kódot :-(

Válaszolt 15/08/2008 13:50
a forrás felhasználó

szavazat
9

Írtam egy blogbejegyzést erről a problémáról .

A lényeg az, hogy ha azt szeretnénk, olcsó frissítések ... és azt szeretné, hogy biztonságos-e a párhuzamos használat. próbáld ki:

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

Így van 1 művelet a frissítéseket, és maximum 3 műveletek betétekkel. Tehát, ha általában frissítése ez egy biztonságos olcsó lehetőség.

Azt is nagyon óvatos, ne használja bármit, ami nem biztonságos az egyidejű használatát. Az igazán könnyű eljutni elsődleges kulcs megsértése vagy ismétlődő sorok a termelés.

Válaszolt 21/09/2008 23:05
a forrás felhasználó

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