20. april 2004 - 12:37Der er
5 kommentarer og 1 løsning
Insert into table via Linked Server
Jeg har en tabel på min egen database (lad os kalde den thistable). Jeg har også en tabel på en database, som kan nåes via linked server (lad os kalde den linkedtable).
Nu skal jeg have indsat data fra thistable ind i linkedtable.
Normalt vil jeg gøre således: insert into linkedtable select * from thistable
Men nu kan linkedtable jo kun nåes via linked server, så nu skal jeg bruge OpenQuery.
Hvordan gør jeg det?
OpenQuery(linkedserver, 'insert into linkedtable select * from thistable') vil jo søge efter thistable på den forkerte database.
Jeg vil helst undgå at bruge dot-notation, men jeg kan godt bruge dynamisk SQL.
Havde ikke set at du helst vil undgå dot-notation.
Du skal lige være opmærksom på, at dot-notation giver mere effektiv sql kode end når den undlades (dvs. dbo.mintabel er bedre end mintabel uden ejer) - og at dynamtisk sql (inkl. openquery / openrowset) performer væsenligt dårligere end "statisk".
Jeg havde ellers læst mig til på forskellige sites for MS SQL at man netop ved dot-notationen kan risikere at en query kan tage en masse tid at udføre. Det var derfor jeg ville undgå dot-notationen.
Ret beset er OpenQuery vel heller ikke dynamisk kode. Man kan faktisk slet ikke få lov til at sætte dynamisk kode ind i kaldet til OpenQuery.
Create Proc X as select * from ('Not a valid query')
giver da også fejl når man forsøger at køre proceduren på, så den bliver faktisk evalueret af precompileren (queryplan).
insert openquery(vitaemother, 'select * from <table>') og delete from OpenQuery(vitaemother, 'select * from <table>')
Man skal have et index (i mit tilfælde var det en primary key, så jeg ved ikke om nonclustered indexes fungerer) på tabellen. Der er vist også noget med at OpenQuery er case sensitiv mht tabelnavn (og muligvis kolonnenavne).
Lige vedr. dot-notation og performance: det er ganske forkert at dot-notation giver dårligere performance:
Når man ikke anvender dot-notation foretager sql server en søgning efter objektet ejet af den aktuelle bruger og såfremt det ikke findes, en søgning efter objektet ejet af dbo. Dermed kan en query plan ikke genbruges og sql server skal rekompilere sql'en og lave en ny query plan. Benytter man dot-notation sparer man søgningen og query plan kan genbruges.
Brug af OpenQuery og OpenRowset sætter performance kraftigt ned (du kan sammenligne det med dynamisk sql i det den sql (procedure) det indgår i altid skal rekompileres en ekstra gang) - de åbner nemlig en ny session til serveren og afvikler sql'en via den som Ad Hoc sql. Du får altså både overhead for at oprette en forbindelse, forøget ramforbrug (hver query tager ca. 1 MB ram som standard) og da du ikke benytter dot-notation - forøget ram forbrug.
Derudover skal du angive brugernavn / password i en openquery - det sænker sikkerhedsniveauet...
Synes godt om
Ny brugerNybegynder
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.