Avatar billede frankmortensen Nybegynder
25. juni 2012 - 09:32 Der er 10 kommentarer og
1 løsning

Importer og erstat tabel - bedste praksis?

Jeg har brug for en ledetråd til hvordan man bruger C# LINQ til at importere data til og fuldstændigt erstatter indholdet i en tabel i en MS SQL database med det man importerer (samtidigt med at andre processer kan læse i tabellen uforstyrret)?
Noget i stil med:
1. Lav en tom kopi af tabellen.
2. Udfyld tabel kopien med importeret data.
3. Erstat den originale tabel med kopien.
Avatar billede montago Praktikant
25. juni 2012 - 12:35 #1
1. med SMO (SQL Management Objects) kan du kopiere strukturen over i en ny tabel

2. Derefter importere du med SqlBulkCopy objekter direkte ind i din nye tabel

3. Derefter renamer du tabellerne.

---

Du vil få en del udfordringer hvis man kan lave ændringer i tabellen mens du importere, fordi, hvad skal der ske med ændringerne ?

såfremt der er specielle rettigheder på tabellen og constraints, skal disse overføres og opdateres under/efter flytningen. eventuelt kan man DISABLE CONTRAINTS og ENABLE dem bagefter igen.

alt i alt er det ikke nogen nem opgave - men det kan lade sig gøre :)
Avatar billede frankmortensen Nybegynder
25. juni 2012 - 14:36 #2
Der skal ikke rettes i den originale tabel - kun læses fra.
Tak for svaret.
Hvis du lægger et svar - så klikker jeg på accepter...
Avatar billede montago Praktikant
25. juni 2012 - 14:58 #3
du sikker på du har fået svar nok ?
Avatar billede frankmortensen Nybegynder
25. juni 2012 - 15:38 #4
Har du holdt noget tilbage? :-)
Avatar billede Syska Mester
25. juni 2012 - 15:45 #5
Tror mere han tænkte på om det var nok til at komme i mål med din løsning ...
Avatar billede frankmortensen Nybegynder
25. juni 2012 - 15:47 #6
Bestemt
Avatar billede montago Praktikant
25. juni 2012 - 15:52 #7
det kunne bare godt være der var lidt ting du gerne vil have uddybet :) - evt. mens du kigger på det.

Men du kan bare spørge senere selvom spørgsmålet er lukket

Et par tips med på vejen:

(2) SQL Databasens log indstillinger skal sættes til Bulk Log eller Simple Log, for at øge hastigheden

(2) hvis du har millioner af rækker, er den hurtigste måde at bruge BulkCopy på at: først prøve med 10.000 rækker, hvis den fejler, dele op i bidder af 100x100 og prøve med dem. Dem som så fejler bidder man op i 100x1 som så derved mindsker antallet af retry's
Avatar billede janus_007 Nybegynder
25. juni 2012 - 18:09 #8
Hvorfor bruge C# Linq?, hvilken Sql Server version bruger du?


Montago -> Jeg tvivler stærkt på at det går hurtigere at ændre recovery modellen til simple, alle transaktioner skal skrives alligevel, men bulk logging er god :)
Avatar billede frankmortensen Nybegynder
25. juni 2012 - 20:40 #9
Den resterende del skal laves i C# - derfor vil jeg bruge linq.
Der er ingen sql-server version endnu, men bliver sansynligvis 2008.
Skrive hastigheden er ikke så vigtig.
Avatar billede Syska Mester
25. juni 2012 - 20:55 #10
Der findes ikke god pure linq måde at gøre dette på. Linq er jo også  bare lidt sukker rundt om rugbrødet.

Hvis du tænker på Linq2Sql, L2S eller hvad den nu bliver kaldt ude i byen. Så begynd at løbe nu ... det er LANGSOMT. 1 row, 1 insert. LØB LANGT VÆK.

SqlBulkCopy er den eneste vej frem hvis du skal lave mange inserts.

Skal du lave insert og update ... så kig på MERGE i sql 2008 og frem, men det kræver lidt SQL skrevet i hånden, men kan bestemt anbefales(bruge det selv)

Du får ikke overstående til at køre godt ved at bruge en ORM til at lave store batch inserts. ( Måske NHibernate har noget, ved det ikke )
Avatar billede frankmortensen Nybegynder
25. juni 2012 - 21:09 #11
Tak for SqlBulkCopy-tippet.
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