Avatar billede iakob Nybegynder
20. april 2004 - 12:37 Der 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.
Avatar billede trer Nybegynder
20. april 2004 - 12:44 #1
Når du bruger en linked server kan du da svjh referere den direkte:

insert into linkservernavn.objectowner.linkedtable
select * from mindb.objectowner.thistable

objektejeren er normalt DBO.

Du kan altid specificere et objekt i formen db.ejer.objekt
Avatar billede venne Nybegynder
20. april 2004 - 13:36 #2
Med linked server er det fire-leddet objektnavn: server.database.ejer.objekt

Hvorfor vil du undgå dot-notation?
Avatar billede trer Nybegynder
20. april 2004 - 14:26 #3
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".
Avatar billede iakob Nybegynder
21. april 2004 - 10:17 #4
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).
Avatar billede iakob Nybegynder
22. april 2004 - 08:07 #5
dbforums.com havde svaret.
Man gør således:

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).
Avatar billede trer Nybegynder
22. april 2004 - 08:47 #6
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...
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