09. februar 2004 - 14:08Der er
13 kommentarer og 1 løsning
SQL i Excel
Hej,
Er der nogen der ved hvorfor det ikke er muligt at foretage en Sql-sats (query) med "Create table" i Excel? Det er ikke nogen problem men at foretage en almindelig Select sats. Der kommer ikke noget resultat ud fra queryn når jeg bruger Create
Først, har du ret til at oprette tabeller i databasen? Og dernæst - en "create table" returnerer jo ikke noget output - mener du at tabellen ikke bliver oprettet?
Ja, jeg skal have rettigheder at oprette tabeller. Det virker når jeg körer det i Query men når jeg åbner samme spörgsmål i Excel via Query så virker det ikke.
Her er min kode :) --------------------------- CREATE TABLE #Temp_Historik ( ActNo CHAR(30) ) INSERT #Temp_Historik
SELECT DISTINCT a.ActNo FROM niAct a(NOLOCK), niHist b(NOLOCK) WHERE a.ActNo = b.ObjectNo AND b.ObjectType = 1 AND b.Action IN (Brev1', 'Brev2') --------------------------------------------------------------- CREATE TABLE #Temp_Utskrift ( ActNo CHAR(30) ) INSERT #Temp_Utskrift
SELECT DISTINCT a.ActNo FROM niAct a(NOLOCK), niAcntdo b(NOLOCK) WHERE a.ActNo = b.ObjectNo AND b.ObjectType = 1 AND b.Action IN (BREV1', 'BREV2') --------------------------------------------------------------- CREATE TABLE #Temp_Sammanfogning ( ActNo CHAR(30) ) INSERT #Temp_Sammanfogning
SELECT DISTINCT ActNo FROM #Temp_Historik
INSERT #Temp_Sammanfogning
SELECT DISTINCT ActNo FROM #Temp_Utskrift --------------------------------------------------------------- SELECT DISTINCT a.ActNo FROM niAct a(NOLOCK), niActDeb b(NOLOCK), niDbMain c(NOLOCK), niAcntdo d WHERE a.ActNo = b.ActNo AND b.DebtorNo = c.DebtorNo AND a.ActNo = d.ObjectNo AND d.Objecttype = 1 AND d.Action LIKE ('Krav%') AND a.CreditorNo IN ('130', '132', '133', '139', '161', '163', '164', '165', '190') AND a.RegDate < a.RegDate + 180 AND c.WrongAddress = 0 AND a.ClosureDate IS NULL AND a.ActNo NOT IN ( SELECT ActNo FROM #Temp_Sammanfogning )
DROP TABLE #Temp_Historik, #Temp_Utskrift, #Temp_Sammanfogning
Tilladelsen til at oprette temp tabeller har svjh alle. Jeg tror i stedet at du skal lægge ovenstående ind som en stored procedure på serveren.
Inden da, så kan du prøve at ændre # til ##. Det ændrer de temporære tabeller fra at være lokale i scope til globale - det kan løse dit problem hvis det er fordi Excels query del affyrer hvert statement i sit eget scope.
create procedure myquery as begin CREATE TABLE #Temp_Historik ( ActNo CHAR(30) ) INSERT #Temp_Historik
SELECT DISTINCT a.ActNo FROM niAct a(NOLOCK), niHist b(NOLOCK) WHERE a.ActNo = b.ObjectNo AND b.ObjectType = 1 AND b.Action IN (Brev1', 'Brev2') --------------------------------------------------------------- CREATE TABLE #Temp_Utskrift ( ActNo CHAR(30) ) INSERT #Temp_Utskrift
SELECT DISTINCT a.ActNo FROM niAct a(NOLOCK), niAcntdo b(NOLOCK) WHERE a.ActNo = b.ObjectNo AND b.ObjectType = 1 AND b.Action IN (BREV1', 'BREV2') --------------------------------------------------------------- CREATE TABLE #Temp_Sammanfogning ( ActNo CHAR(30) ) INSERT #Temp_Sammanfogning
SELECT DISTINCT ActNo FROM #Temp_Historik
INSERT #Temp_Sammanfogning
SELECT DISTINCT ActNo FROM #Temp_Utskrift --------------------------------------------------------------- SELECT DISTINCT a.ActNo FROM niAct a(NOLOCK), niActDeb b(NOLOCK), niDbMain c(NOLOCK), niAcntdo d WHERE a.ActNo = b.ActNo AND b.DebtorNo = c.DebtorNo AND a.ActNo = d.ObjectNo AND d.Objecttype = 1 AND d.Action LIKE ('Krav%') AND a.CreditorNo IN ('130', '132', '133', '139', '161', '163', '164', '165', '190') AND a.RegDate < a.RegDate + 180 AND c.WrongAddress = 0 AND a.ClosureDate IS NULL AND a.ActNo NOT IN ( SELECT ActNo FROM #Temp_Sammanfogning )
DROP TABLE #Temp_Historik, #Temp_Utskrift, #Temp_Sammanfogning end go
Derefter - afvikl den fra excel med
exec myquery
hvis du har behov for parametre til queryen så skal du angive dem som parametre til sp'en - og definere dem i header
create procedure myquery (@s varchar(50),,,@i int, @whatever datetime) as ....
komma-fejlen er i den kode jeg brugte cut'n'paste på. Prøv at tage den query du har der virker og indsæt den i følge skabelon
create procedure myquery as begin ... indsæt kode her ... end go
Query builderen (MsQuery) kan finde den under "New Database Query" - på en af fanerne har du mulighed for "view data or edit query in Microsoft Query" - og her slår du til.
SELECT DISTINCT a.ActNo FROM niAct a(NOLOCK), niHist b(NOLOCK) WHERE a.ActNo = b.ObjectNo AND b.ObjectType = 1 AND (b.Action LIKE 'HOT%' OR b.Action LIKE 'Speciel%') AND b.Time < b.Time + 400
SELECT DISTINCT a.ActNo FROM niAct a(NOLOCK), niAcntdo b(NOLOCK) WHERE a.ActNo = b.ObjectNo AND b.ObjectType = 1 AND b.Action IN ('HOT-FOGEDRETTEN', 'Speciel%') AND b.Date < b.Date + 400
SELECT DISTINCT a.ActNo FROM niAct a(NOLOCK), niActDeb b(NOLOCK), niDbMain c(NOLOCK), niAcntdo d WHERE a.ActNo = b.ActNo AND b.DebtorNo = c.DebtorNo AND a.ActNo = d.ObjectNo AND d.Objecttype = 1 AND d.Action LIKE ('Krav%') AND a.CreditorNo IN ('130', '132', '133', '139', '161', '163', '164', '165', '190') AND b.StatusCode IN ('INKASSO','KRAV','EFTERBEV') AND a.RemTotalCapital > 30 AND a.RemTotalCapital < 100 AND a.RegDate < a.RegDate + 180 AND c.WrongAddress = 0 AND a.ClosureDate IS NULL AND a.ActNo NOT IN ( SELECT ActNo FROM #Temp_Sammanfogning )
DROP TABLE #Temp_Historik, #Temp_Utskrift, #Temp_Sammanfogning end go
Det färdige resultat skal väre at man bare åbner Excel-arket og derefter körer queryn af sig selv og opdaterer datan. Endelig vil jeg slet ikke have mere med queryn at göre.
Jeg skal nok sörge for at du får dine points selvom du ikke gider mere. De er velfortjente :)
Jeg har lige forsøgt at oprette din query selv - det går fint (jeg kan blot ikke afvikle den da jeg mangler tabellerne).
Eneste sted jeg kan se et muligt problem er i din DROP TABLE - jeg ville nok lave et udtryk til hver enkelt tabel - eller helt fjerne det. Tabellerne droppes automatisk når proceduren er kørt.
I øvrigt - med de tabeller du har - i stedet for temp tabeller - så ret det til
declare @Temp_Historik table (ActNo CHAR(30)) INSERT @Temp_Historik SELECT DISTINCT a.ActNo FROM niAct a(NOLOCK), niHist b(NOLOCK) WHERE a.ActNo = b.ObjectNo AND b.ObjectType = 1 AND (b.Action LIKE 'HOT%' OR b.Action LIKE 'Speciel%') AND b.Time < b.Time + 400
etc. en tablevariabel giver bedre performance end end temp tabel.
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.