Vra

MySQL het hierdie ongelooflik bruikbare dog eie REPLACE INTO SQL opdrag.

Kan dit maklik nagevolg word in SQL Server 2005?

Begin 'n nuwe transaksie, doen 'n Select() en dan óf UPDATE of INSERT en COMMIT is altyd 'n bietjie van 'n pyn, veral as jy dit in die toepassing doen en dus altyd 2 weergawes van die stelling behou.

Ek wonder of daar 'n maklike en universeel manier om so 'n funksie in SQL Server 2005 te implementeer?

Was dit nuttig?

Oplossing

Dit is iets wat my irriteer oor MSSQL (krap op my blog).Ek wens MSSQL ondersteun upsert.

@Dillie-O se kode is 'n goeie manier in ouer SQL-weergawes (+1 stem), maar dit is steeds basies twee IO-bewerkings (die exists en dan die update of insert)

Daar is 'n effens beter manier hierdie pos, basies:

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

Dit verminder dit tot een IO-bewerkings as dit 'n opdatering is, of twee as 'n insetsel.

MS SQL2008 stel bekend merge van die SQL:2003-standaard:

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

Nou is dit eintlik net een IO-operasie, maar aaklige kode :-(

Ander wenke

Die funksionaliteit waarna u soek, word tradisioneel 'n UPSERT genoem.Om ten minste te weet wat dit genoem word, kan jou help om te vind waarna jy soek.

Ek dink nie SQL Server 2005 het enige goeie maniere om dit te doen nie.2008 stel die MERGE-stelling bekend wat gebruik kan word om dit te bereik soos getoon in: http://www.databasejournal.com/features/mssql/article.php/3739131 of http://blogs.conchango.com/davidportas/archive/2007/11/14/SQL-Server-2008-MERGE.aspx

Merge was beskikbaar in die beta van 2005, maar hulle het dit in die finale vrystelling verwyder.

Wat die upsert/merge doen, is iets tot die effek van...

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

So hopelik kan die kombinasie van daardie artikels en hierdie pseudo-kode dinge aan die beweeg kry.

Ek het geskryf a blogpos oor hierdie kwessie.

Die slotsom is dat as jy goedkoop opdaterings wil hê ...en jy wil veilig wees vir gelyktydige gebruik.probeer:

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

Op hierdie manier het jy 1 bewerking vir opdaterings en 'n maksimum van 3 bewerkings vir invoegings.so, as jy oor die algemeen opdateer, is dit 'n veilige goedkoop opsie.

Ek sal ook baie versigtig wees om niks wat onveilig is vir gelyktydige gebruik te gebruik nie.Dit is regtig maklik om primêre sleuteloortredings of duplikaatrye in produksie te kry.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top