Umstellung von Oracle zu MSSQL Problem bei ein paar ODBC abfragen

Voosjey

Benutzer
Beiträge
24
Hallo

wir haben unserem Datenbankserver gewechselt von ORACLE zu MSSQL ich konnte 99% aller abfragen umschreiben. doch bei ein paar Abfragen klappt es nicht. die erste abfrage die zu diesem Fehler führt:
Der mehrteilige Bezeichner "atko.verlade_dat_atko" konnte nicht gebunden werden. Die SQL sieht so aus:
SQL:
SELECT atko.nr_atko, atko.nr_kd, kd.ku_bez_kd, atko.verlade_dat_atko, atpo.br_atpo, atpo.ho_atpo, atpo.szr1_atpo, atpo.szr2_atpo,
atpo.std_di_atpo, ar.nr_divz, atpo.me_atpo, atpokl.typ_atpokl, atpokl.nr_atposl_atpokl, ar.nr_arpg, ar.nr_arwg, ar.nr_argr, ar.nr_arty, ar.bez_ar,
atpo.monr_atpo, atpokl.bez_quell_atpokl, atpo.qm_atpo, atko.st_we_atko,atpo.ke_st_atpo, atpo.ke_sp_atpo, atpo.ke_ba_atpo, (select count(*) from bspo where
bspo.nr_atko = atpokl.nr_atko and
bspo.atponr_bspo = atpokl.nr_atpo and
bspo.nr_atpokl = atpokl.nr_atpokl and
bspo.bez_quell_bspo = 1) as "Fremd",atpokl.NR_VATER_ATPOKL,
(select count (*) from atpozl where
atpozl.nr_atko = atpo.nr_atko and
atpozl.nr_atpo = atpo.nr_atpo and
atpozl.zlklnr_atpozl = '39' and
atpozl.nr_beaart = 310 and
atpozl.nr_beatyp = 600) as "Sandstrahlen",
(select count (*) from atpozl where
atpozl.nr_atko = atpo.nr_atko and
atpozl.nr_atpo = atpo.nr_atpo and
atpozl.zlklnr_atpozl = '08' and
atpozl.nr_beaart = 910 and
atpozl.nr_beatyp = 102) as "Heatsoak",
(select count (*) from atpozl where
atpozl.nr_atko = atpo.nr_atko and
atpozl.nr_atpo = atpo.nr_atpo and
atpozl.zlklnr_atpozl = '01' and
atpozl.nr_beaart = 210 and
atpozl.nr_beatyp = 100) as "Handgesäumt"
FROM atko, atpo, atpokl, ar, kd
WHERE atko.fil_atko in (1,2) and
atpokl.nr_atko = atko.nr_atko and
atpokl.nr_atpo = atpo.nr_atpo and
atpo.nr_atko = atko.nr_atko and
atpokl.typ_atpokl in (1,2,3,4,10) and
atko.nr_vgart < 110 and
atko.st_atko < 120 and atko.st_atko > 101 and
kd.nr_kd = atko.nr_kd and
ar.nr_ar = atpokl.nr_ar and
atko.verlade_dat_atko >= ? and
atko.verlade_dat_atko <= ?

Die Fehlermeldung hat anscheinend was mit der Parameterabfrage am ende zu tun. die Parameter sehen so aus:

2024-08-29
2024-09-27

Wo ist mein Fehler ich finde ihn nicht.
 
Werbung:
Also ein Syntax-Problem kann ich nicht feststellen, unter der Annahme, das die beiden ? am Ende durch Werte ersetzt werden. Die Fehlermeldung deutet eigentlich darauf hin, das die genannte Spalte nicht existiert oder der Tabellen-Alias nicht existiert.

Die Abfrage als ganzes sieht sehr gruselig aus. Du solltest auf explizite Joins umstellen und auch bei den Subselects mit count(*) bin ich sehr skeptisch. Jeder Subselect bedeutet eine zusätzliche Abfrage, besser wäre vermutlich ein Join mit Gruppierung und sum() + CASE.
 
Code:
SELECT atko.nr_atko, atko.nr_kd, kd.ku_bez_kd, atko.verlade_dat_atko, atpo.br_atpo, atpo.ho_atpo, atpo.szr1_atpo, atpo.szr2_atpo,
atpo.std_di_atpo, ar.nr_divz, atpo.me_atpo, atpokl.typ_atpokl, atpokl.nr_atposl_atpokl, ar.nr_arpg, ar.nr_arwg, ar.nr_argr, ar.nr_arty, ar.bez_ar,
atpo.monr_atpo, atpokl.bez_quell_atpokl, atpo.qm_atpo, atko.st_we_atko,atpo.ke_st_atpo, atpo.ke_sp_atpo, atpo.ke_ba_atpo, 
sum( CASE WHEN
bspo.bez_quell_bspo = 1
THEN 1 ELSE 0 END ) as "Fremd",
atpokl.NR_VATER_ATPOKL,
sum( CASE WHEN
atpozl.zlklnr_atpozl = '39' and
atpozl.nr_beaart = 310 and
atpozl.nr_beatyp = 600
THEN 1 ELSE 0 END ) as "Sandstrahlen",
sum( CASE WHEN
atpozl.zlklnr_atpozl = '08' and
atpozl.nr_beaart = 910 and
atpozl.nr_beatyp = 102
THEN 1 ELSE 0 END ) as "Heatsoak",
sum( CASE WHEN
atpozl.zlklnr_atpozl = '01' and
atpozl.nr_beaart = 210 and
atpozl.nr_beatyp = 100
THEN 1 ELSE 0 END ) as "Handgesäumt"
FROM atko
INNER JOIN atpo ON  atko.nr_atko = atpo.nr_atko
INNER JOIN atpokl ON atko.nr_atko = atpokl.nr_atko AND atpo.nr_atpo = atpokl.nr_atpo
INNER JOIN ar ON atpokl.nr_ar = ar.nr_ar
INNER JOIN kd ON atko.nr_kd = kd.nr_kd
LEFT JOIN bspo ON atpokl.nr_atko = bspo.nr_atko AND atpokl.nr_atpo = bspo.atponr_bspo AND atpokl.nr_atpokl = bspo.nr_atpokl
WHERE atko.fil_atko in (1,2) and
atpokl.typ_atpokl in (1,2,3,4,10) and
atko.nr_vgart < 110 and
atko.st_atko < 120 and
atko.st_atko > 101 and
atko.verlade_dat_atko BETWEEN ? AND ?
GROUP BY atko.nr_atko, atko.nr_kd, kd.ku_bez_kd, atko.verlade_dat_atko, atpo.br_atpo, atpo.ho_atpo, atpo.szr1_atpo, atpo.szr2_atpo,
atpo.std_di_atpo, ar.nr_divz, atpo.me_atpo, atpokl.typ_atpokl, atpokl.nr_atposl_atpokl, ar.nr_arpg, ar.nr_arwg, ar.nr_argr, ar.nr_arty, ar.bez_ar,
atpo.monr_atpo, atpokl.bez_quell_atpokl, atpo.qm_atpo, atko.st_we_atko,atpo.ke_st_atpo, atpo.ke_sp_atpo, atpo.ke_ba_atpo, atpokl.NR_VATER_ATPOKL
Ich kenne deine Daten nicht und kann die aus dem Select auch nicht ableiten. Vieles scheint mir unnötig, kann sein das das GROUP BY überhaupt keinen Sinn ergibt.
 
leider gab es mit dem neuen SQL noch mehr von den Fehlern:
Der mehrteilige Bezeichner "atpozl.zlklnr_atpozl" konnte nicht gebunden werden.
Der mehrteilige Bezeichner "atpozl.nr_beaart" konnte nicht gebunden werden.
Der mehrteilige Bezeichner "atpozl.nr_beatyp" konnte nicht gebunden werden.
Der mehrteilige Bezeichner "atpozl.zlklnr_atpozl" konnte nicht gebunden werden.
Der mehrteilige Bezeichner "atpozl.nr_beaart" konnte nicht gebunden werden.
Der mehrteilige Bezeichner "atpozl.nr_beatyp" konnte nicht gebunden werden.
Der mehrteilige Bezeichner "atpozl.zlklnr_atpozl" konnte nicht gebunden werden.
Der mehrteilige Bezeichner "atpozl.nr_beaart" konnte nicht gebunden werden.
Der mehrteilige Bezeichner "atpozl.nr_beatyp" konnte nicht gebunden werden.
 
Ja ich habe atpozl für atpokl gehalten, es fehlte daher ein Join.
Code:
SELECT atko.nr_atko, atko.nr_kd, kd.ku_bez_kd, atko.verlade_dat_atko, atpo.br_atpo, atpo.ho_atpo, atpo.szr1_atpo, atpo.szr2_atpo,
atpo.std_di_atpo, ar.nr_divz, atpo.me_atpo, atpokl.typ_atpokl, atpokl.nr_atposl_atpokl, ar.nr_arpg, ar.nr_arwg, ar.nr_argr, ar.nr_arty, ar.bez_ar,
atpo.monr_atpo, atpokl.bez_quell_atpokl, atpo.qm_atpo, atko.st_we_atko,atpo.ke_st_atpo, atpo.ke_sp_atpo, atpo.ke_ba_atpo, 
sum( CASE WHEN
bspo.bez_quell_bspo = 1
THEN 1 ELSE 0 END ) as "Fremd",
atpokl.NR_VATER_ATPOKL,
sum( CASE WHEN
atpozl.zlklnr_atpozl = '39' and
atpozl.nr_beaart = 310 and
atpozl.nr_beatyp = 600
THEN 1 ELSE 0 END ) as "Sandstrahlen",
sum( CASE WHEN
atpozl.zlklnr_atpozl = '08' and
atpozl.nr_beaart = 910 and
atpozl.nr_beatyp = 102
THEN 1 ELSE 0 END ) as "Heatsoak",
sum( CASE WHEN
atpozl.zlklnr_atpozl = '01' and
atpozl.nr_beaart = 210 and
atpozl.nr_beatyp = 100
THEN 1 ELSE 0 END ) as "Handgesäumt"
FROM atko
INNER JOIN atpo ON  atko.nr_atko = atpo.nr_atko
INNER JOIN atpokl ON atko.nr_atko = atpokl.nr_atko AND atpo.nr_atpo = atpokl.nr_atpo
INNER JOIN ar ON atpokl.nr_ar = ar.nr_ar
INNER JOIN kd ON atko.nr_kd = kd.nr_kd
LEFT JOIN atpozl ON atpo.nr_atko = atpozl.nr_atko AND atpo.nr_atpo = atpozl.nr_atpo
LEFT JOIN bspo ON atpokl.nr_atko = bspo.nr_atko AND atpokl.nr_atpo = bspo.atponr_bspo AND atpokl.nr_atpokl = bspo.nr_atpokl
WHERE atko.fil_atko in (1,2) and
atpokl.typ_atpokl in (1,2,3,4,10) and
atko.nr_vgart < 110 and
atko.st_atko < 120 and
atko.st_atko > 101 and
atko.verlade_dat_atko BETWEEN ? AND ?
GROUP BY atko.nr_atko, atko.nr_kd, kd.ku_bez_kd, atko.verlade_dat_atko, atpo.br_atpo, atpo.ho_atpo, atpo.szr1_atpo, atpo.szr2_atpo,
atpo.std_di_atpo, ar.nr_divz, atpo.me_atpo, atpokl.typ_atpokl, atpokl.nr_atposl_atpokl, ar.nr_arpg, ar.nr_arwg, ar.nr_argr, ar.nr_arty, ar.bez_ar,
atpo.monr_atpo, atpokl.bez_quell_atpokl, atpo.qm_atpo, atko.st_we_atko,atpo.ke_st_atpo, atpo.ke_sp_atpo, atpo.ke_ba_atpo, atpokl.NR_VATER_ATPOKL
 
wollte gerade schreiben wow danke die SQL funktioniert besser, aber leider muss ich sagen es fehlen dann einiges an Daten. Witziger weise funktioniert dann auch die Datumsabfrage von Excel. Leider sieht es aber danach aus das ich doch die vorhandene SQL nutzen muss und dort den fehler weg bekommen muss., was ich komisch finde ist wenn ich statt den ? direkt ein Datum reinschreibe funktioniert es, nur wenn ich das ? rein setze und die Parameter von der Exceltabelle abfrage kommt die Meldung mit den mehrteiligen Bezeichnern. Also gehe ich mal davon aus das ich irgendwas bei Excel einstellen muss, damit Excel dem MSSQL den richtigen WERT überträgt, weiß jemand rat?
 
Dazu kann ich leider nicht viel sagen, ich schreibe alles im MSSQL Management Studio. Die ? hast du da aber selbst rein gesetzt oder kommen die wirklich von Excel? Unterscheidet Excel die beiden Variablen den korrekt?
 
mit dem ? werden Tabellen Inhalte in eine SQL abfrage per Parameter eingetragen. Ist eine ganz normale Funktion im Excel. Das Problem ist ich verstehe den Fehler mit dem mehrteiligen Bezeichner nicht. Er soll einfach für das erste ? den Parameter1 übertragen, der ist im Feld C6 verknüpft, dort steht ein simpeles Datum. und dann kommt die Fehlermeldung, wenn ich das Datum direkt in den SQL eintrage dann funktioniert die Abfrage auch.
 

Anhänge

  • Excel-Parameter.webp
    Excel-Parameter.webp
    30,1 KB · Aufrufe: 2
Teste mal bitte ob der Fehler auch auftritt, wenn du nur ein ? im WHERE-Teil hast und nur ein Parameter gesetzt werden soll. Also einfach erstmal nur atko.verlade_dat_atko >= ? als Bedingung.
 
Werbung:
Zurück
Oben