SQL Server 2005 gjennomføringen av MySQL BYTT TIL?

stemmer
75

MySQL har dette utrolig nyttig ennå properitary REPLACE INTOSQL kommando.

Kan dette lett bli emulert i SQL Server 2005?

Starte en ny transaksjon, gjør en Select()og deretter enten UPDATEeller INSERT, og COMMITer alltid litt av en smerte, spesielt når du gjør det i søknaden og derfor alltid holde 2 versjoner av uttalelsen.

Jeg lurer på om det er en enkel og universell måte å implementere en slik funksjon i SQL Server 2005?

Publisert på 01/08/2008 klokken 22:13
kilden bruker
På andre språk...                            


4 svar

stemmer
54

Dette er noe som irriterer meg om MSSQL ( rant på bloggen min ). Jeg ønsker MSSQL støttet upsert.

@ Dillie-O-koden er en god måte i eldre SQL versjoner (1 stemme), men det fortsatt er i utgangspunktet to IO-operasjoner (den existsog deretter updateeller insert)

Det er en litt bedre måte på dette innlegget , i utgangspunktet:

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

Dette reduserer den til en IO operasjoner, dersom det er en oppdatering, eller to om en innsats.

MS SQL2008 innfører mergefra 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, ... )

Nå er det egentlig bare en IO operasjon, men forferdelig kode :-(

Svarte 15/08/2008 kl. 12:50
kilden bruker

stemmer
22

Funksjonaliteten du leter etter er tradisjonelt kalles en UPSERT. Atleast vite hva det heter kan hjelpe deg å finne det du leter etter.

Jeg tror ikke SQL Server 2005 har noen gode måter å gjøre dette på. 2008 introduserer MERGE statement som kan brukes for å oppnå dette, som vist her: http://www.databasejournal.com/features/mssql/article.php/3739131 eller http://blogs.conchango.com/davidportas/archive/ 2007/11 / 14 / SQL-Server-2008-MERGE.aspx

Flett var tilgjengelig i betaversjonen av 2005, men de fjernet det ut i den endelige versjonen.

Svarte 01/08/2008 kl. 22:22
kilden bruker

stemmer
16

Hva upsert / merge gjør er noe til effekten av ...

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

Så forhåpentligvis kombinasjonen av disse artiklene og denne pseudo-kode kan få ting i bevegelse.

Svarte 01/08/2008 kl. 22:31
kilden bruker

stemmer
9

Jeg skrev et blogginnlegg om dette problemet .

Poenget er at hvis du ønsker billige oppdateringer ... og du ønsker å være trygge for samtidig bruk. prøve:

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

På denne måten har en operasjon for oppdateringer og en maks 3 operasjoner for innsatser. så hvis du er generelt oppdaterer dette er et trygt billig alternativ.

Jeg vil også være svært forsiktig med å bruke noe som er utrygt for samtidig bruk. Det er veldig lett å få primærnøkkel brudd eller kopiere rader i produksjon.

Svarte 21/09/2008 kl. 22:05
kilden bruker

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