Avatar billede henrik_40 Nybegynder
13. marts 2008 - 14:03 Der er 5 kommentarer og
1 løsning

joine forskellige datatyper

Hej
Jeg har to tabeller jeg gerne vil joine. Desværre har nøgler forskellige datatyper, derfor vil jeg gerne konvertere datatypen i forespørgslen. Jeg har fundet "cast" og "convert" som mulige funktioner, men har ikke lige kunne få lavet den rigtige sql. Kan nogle hjælpe mig?

tabel Aktiviteter
-----------------
ActivityID (pk, int, not null)
felt2
felt3
osv.

tabel: Navision
---------------
No_(pk, varchar(20), not null)
felt2
felt3
felt4
Rep_Nr(varchar(20), not null)


Navision og Aktiviteter (iøvrigt fra to forskellige databaser) skal joines på ActivityID og Rep_Nr og det er mit problem.

sql'en:

SELECT    Navision.dbo.[Invoice Header].Rep_Nr, Activities.ActivityID, Navision.dbo.[Invoice Header].No_,
                      Activities.ContactName
FROM        Navision.dbo.[Invoice Header] INNER JOIN
                      Activities ON Navision.dbo.[Invoice Header].Rep_Nr = Activities.ActivityID

Hilsen
Henrik
Avatar billede arne_v Ekspert
13. marts 2008 - 18:23 #1
CAST(Navision.dbo.[Invoice Header].Rep_Nr AS INTEGER) = Activities.ActivityID

er vaerd at proeve
Avatar billede henrik_40 Nybegynder
13. marts 2008 - 20:27 #2
Det lader til Cast eller convert ikke kan konvertere fra varchar til int. Fra int til varchar virker det.

Desværre får jeg ikke alle forekomster med - men det er måske en en anden fejl?

SELECT * FROM Activities WHERE VendorID = 8 AND PaymentTypeID= 4 AND activityid > 200000
giver 100 rækker MERE end:

SELECT    Navision.dbo.[ServicePartner A_S$Sales Invoice Header].Rep_Nr, ServicePartner.dbo.Activities.ActivityID, Navision.dbo.[ServicePartner A_S$Sales Invoice Header].No_,
                      ServicePartner.dbo.Activities.ContactName
FROM        Navision.dbo.[ServicePartner A_S$Sales Invoice Header] INNER JOIN
                ServicePartner.dbo.Activities ON
                Navision.dbo.[ServicePartner A_S$Sales Invoice Header].Rep_Nr = CAST(ServicePartner.dbo.Activities.ActivityID AS CHAR(10))
WHERE ServicePartner.dbo.Activities.VendorID = 8 AND ServicePartner.dbo.Activities.PaymentTypeID = 4
AND ServicePartner.dbo.Activities.ActivityID > 200000

Hvis jeg piller et enkelt rep_nr ud og laver sql forespørgsel, eksisterer nummeret og burde dermed være i BEGGE forespørgsler. Måske udenfor det oprindelige spørgsmål, men vil du kigge på det alligevel?
/henrik


giver 100 rækker MERE end:

SELECT    Navision.dbo.[ServicePartner A_S$Sales Invoice Header].Rep_Nr, ServicePartner.dbo.Activities.ActivityID, Navision.dbo.[ServicePartner A_S$Sales Invoice Header].No_,
                      ServicePartner.dbo.Activities.ContactName
FROM        Navision.dbo.[ServicePartner A_S$Sales Invoice Header] INNER JOIN
                ServicePartner.dbo.Activities ON
                Navision.dbo.[ServicePartner A_S$Sales Invoice Header].Rep_Nr = CAST(ServicePartner.dbo.Activities.ActivityID AS CHAR(10))
WHERE ServicePartner.dbo.Activities.VendorID = 8 AND ServicePartner.dbo.Activities.PaymentTypeID = 4
AND ServicePartner.dbo.Activities.ActivityID > 200000

Hvis jeg piller et enkelt rep_nr ud og laver sql forespørgsel, eksisterer nummeret og burde dermed være i BEGGE forespørgsler. Måske udenfor det oprindelige spørgsmål, men vil du kigge på det alligevel?
/henrik
Avatar billede henrik_40 Nybegynder
13. marts 2008 - 20:28 #3
sorry har gentaget mig selv. Sådan skulle der have stået:
    Det lader til Cast eller convert ikke kan konvertere fra varchar til int. Fra int til varchar virker det.

Desværre får jeg ikke alle forekomster med - men det er måske en en anden fejl?

SELECT * FROM Activities WHERE VendorID = 8 AND PaymentTypeID= 4 AND activityid > 200000
giver 100 rækker MERE end:

SELECT    Navision.dbo.[ServicePartner A_S$Sales Invoice Header].Rep_Nr, ServicePartner.dbo.Activities.ActivityID, Navision.dbo.[ServicePartner A_S$Sales Invoice Header].No_,
                      ServicePartner.dbo.Activities.ContactName
FROM        Navision.dbo.[ServicePartner A_S$Sales Invoice Header] INNER JOIN
                ServicePartner.dbo.Activities ON
                Navision.dbo.[ServicePartner A_S$Sales Invoice Header].Rep_Nr = CAST(ServicePartner.dbo.Activities.ActivityID AS CHAR(10))
WHERE ServicePartner.dbo.Activities.VendorID = 8 AND ServicePartner.dbo.Activities.PaymentTypeID = 4
AND ServicePartner.dbo.Activities.ActivityID > 200000

Hvis jeg piller et enkelt rep_nr ud og laver sql forespørgsel, eksisterer nummeret og burde dermed være i BEGGE forespørgsler. Måske udenfor det oprindelige spørgsmål, men vil du kigge på det alligevel?
/henrik
Avatar billede henrik_40 Nybegynder
13. marts 2008 - 23:09 #4
Hej
Du havde delvist ret.
Men du skal først være sikker på at det du caster  er et gyldigt cast: WHERE  ISNUMERIC(Rep_Nr) = 1 AND LEN(Rep_Nr) = 6.

Hvis det er iorden snupper jeg selv pointene?
Avatar billede arne_v Ekspert
16. marts 2008 - 00:41 #5
Som du også selv har fundet ud af så kan man sagtens caste fra VARCHAR til INTEGER.

Hvis værdien af VARCHAR ikke er en integer, så får man en nydelig fejlbesked som:

Msg 245, Level 16, State 1, Server ARNEPC3\SQLEXPRESS, Line 1
Conversion failed when converting the varchar value 'A' to data type int.

som ikke efterlader meget tvivl om hvad fejlen skyldes.
Avatar billede henrik_40 Nybegynder
16. marts 2008 - 09:56 #6
ja, det er rigtigt nok ;)
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