Avatar billede petermonielsen Nybegynder
30. marts 2011 - 22:36 Der er 9 kommentarer og
1 løsning

opdatering af flere rækker i éen forespørgsel

Jeg har flere hundrede updates jeg skal lave på een gang ud fra et array af ids: [1,2,3,5,100,110, osv...]

update Model set isFound = true, dateFound = GETDATE() where id= 1,
update Model set isFound = true, dateFound = GETDATE() where id= 2,
update Model set isFound = true, dateFound = GETDATE() where id= 3,
osv.

Er den en måde hvorpå jeg kan få opdateret alle disse rækker uden at skulle eksekvere den samme update statement uhyggeligt mange gange.
Avatar billede Syska Mester
30. marts 2011 - 22:51 #1
MERGE hvis du bruger MSSQL 2008

UPSERT i Orable ( Står for Update and Insert )

UPDATE table1 SET value = 10 WHERE Id IN ( 10, 20, 30, 40)
Avatar billede gnoname Praktikant
31. marts 2011 - 00:45 #2
update Model
set isFound  = true,
    dateFound = GETDATE()
where id IN (
1,2,3,4, ...... 1040)


du kan også mselecte ind i updaten - altså:

update Model
set isFound  = true,
    dateFound = GETDATE()
where id IN (
Select distinct id
from id_table)
Avatar billede Syska Mester
31. marts 2011 - 01:06 #3
Ja, ligesom mit foreslag. Altså en Subquery i den update i stedet.

Du kan også lave en:
UPDATE T
SET T.Name= L.Name
INNER JOIN Languages L ON T.LanguageId = L.LanguageId
FROM Texts T

Muligheder er mange ...
Avatar billede Syska Mester
31. marts 2011 - 01:07 #4
#gnoname
Havde du egentlig noget nyt eller udvidede du bare mit eksempel ?

mvh
Avatar billede petermonielsen Nybegynder
31. marts 2011 - 08:54 #5
hej tak for svarene - jeg bruger faktisk sql server 2008 så jeg kunne godt tænke mig at se et eksempel på hvordan jeg benytter "merge" til dette.
Avatar billede Syska Mester
31. marts 2011 - 11:26 #6
Noget ala:


MERGE INTO PeterTable AS PS
    USING ( VALUES (10, 'Peter', GETDATE())) AS S(Id, Name, Added)
    ON (PS.Id = S.Id)
    WHEN MATCHED THEN
        UPDATE SET PS.Added = S.Added, PS.Name = S.Name
    WHEN NOT MATCHED THEN
        INSERT (Id, Name, Added) VALUES ( S.Id, S.Name, S.Added);


CREATE TABLE [dbo].[PeterTable](
    [Id] [int] NOT NULL,
    [Name] [varchar](50) NOT NULL,
    [Added] [date] NOT NULL
)
Avatar billede petermonielsen Nybegynder
31. marts 2011 - 13:47 #7
hej buzzzz - tak for hjælpen - læg et svar. Også tak til gnoname - men det var jo nok buzzzz der kom først med svaret.
Avatar billede Syska Mester
31. marts 2011 - 14:38 #8
Svar.

Hvad løsning endte du med?

Du kan jo prøve at teste hvad der performer bedst ... jeg synes personligt MERGE er mest optimal hvis du har data uden for din SQL server.

mvh
Avatar billede petermonielsen Nybegynder
01. april 2011 - 08:28 #9
jeg har, til at begynde med, valgt at benytte IN - løsningen - mest fordi den var nem at implementere - og jeg kendte den egentlig godt i forvejen den var blot gået i glemmebogen.
Merge ser interessant ud og den vil jeg teste med om den skulle performe bedre endnu.

Jeg benytter sql server express management studio - ved du hvordan man laver en performance test heri?

Tak for hjælpen
Avatar billede Syska Mester
01. april 2011 - 14:21 #10
Sql Profiler ville være et godt bud, men den er vist ikke med i Express SSMS.

Der er også nogen muligheder for at få execution plans, client statistics i SSMS ... IO og Time Statistics.

Men det er et meget meget stort emne ...

Husk også at ting kører hurtigere når de først er cached.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester