SQL Server 2005 implementering van MySQL VERVANG IN?
-
08-06-2019 - |
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?
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.