Avatar billede rickie Juniormester
09. februar 2004 - 14:08 Der 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
Avatar billede trer Nybegynder
09. februar 2004 - 15:59 #1
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?
Avatar billede rickie Juniormester
10. februar 2004 - 10:07 #2
Hej!

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
Avatar billede trer Nybegynder
10. februar 2004 - 10:22 #3
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.

Mvh
Troels
Avatar billede trer Nybegynder
10. februar 2004 - 10:23 #4
Ovestående var egentlig et svar :-)
Avatar billede rickie Juniormester
10. februar 2004 - 11:03 #5
Hej igen!

Tak for dit svar men det virker desvärre ikke.
Du skriver noget om "stored procedure"?
Dette ved jeg ikke hvordan det virker :(

Kan du hjälpe?
Avatar billede trer Nybegynder
10. februar 2004 - 11:13 #6
opret sp'en således - det gør du kun én gang:

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
....
Avatar billede rickie Juniormester
10. februar 2004 - 11:23 #7
OK! Det lyder godt, men hvordan laver jeg exec myquery i excel.
Jeg var ikke klar over at det var så avanceret :)
Avatar billede trer Nybegynder
10. februar 2004 - 12:15 #8
Du burde blot kunne angive "exec myquery" i stedet for et select udtryk i Excels query builder.
Avatar billede rickie Juniormester
10. februar 2004 - 12:30 #9
Jeg kan ikke lägge ind koden med SP i Query. Der kommer en fejl:
Incorrect syntax near ','
Incorrect syntax near 'go'

Hvad mener du med Excels builder? Når jeg vil importere data går jeg ind unde "data" og "importere" :)
Avatar billede trer Nybegynder
10. februar 2004 - 12:45 #10
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.
Avatar billede rickie Juniormester
10. februar 2004 - 14:08 #11
Det er underligt! Den vil stadig ikke virke.
Nu står der "Incorrect syntax near 'go'"
Koden ser således ud nu:

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 LIKE 'HOT%' OR b.Action LIKE 'Speciel%')
AND
  b.Time < b.Time + 400

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 ('HOT-FOGEDRETTEN', 'Speciel%')
AND
  b.Date < b.Date + 400

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
  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
Avatar billede trer Nybegynder
10. februar 2004 - 14:27 #12
Hvor forsøger du at afvikle den?  Meningen er, at du opretter din sp i Query Analyzer - derefter afvikler du den fra Excel.
Avatar billede rickie Juniormester
10. februar 2004 - 15:04 #13
Ja!

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 :)
Avatar billede trer Nybegynder
10. februar 2004 - 15:40 #14
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.
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

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Netværkstekniker til Forsvarets Cyberdivision i Hvidovre – Er det dig?

Politiets Efterretningstjeneste

CNE-specialist til PET`s indhentningsafdeling

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Teamleder til AL Sydbanks GDPR & Tech Regulation i Aabenraa

Lægemiddelstyrelsen

Løsningsarkitekt

European Stonecraft

Intern Navision/BC Supporter