SQL Statement Error Ungültiger Objektname

Martinha

Benutzer
Beiträge
24
Hi,

manchmal sitzt man davor und sieht es nicht. Kann mir jemand verraten, was an diesem SQL Statement falsch ist:

create view qryleistungsepaperson as SELECT Top(1000) Leistung.LeistungId
, Leistung.Leistungsart
, Leistung.LeistungStatus
, Leistung.AktuellerBetrag
, Sepamandat.merkmal
, Sepamandat.SEPAMandatStatus
, Leistung.AktuellerBetrag
, Konto.KontoStatus
, Konto.KontoArt
, [saldo]*-1 AS Betrag
, Person.NachName
, Person.Vorname
, Konto.IBAN
, Sepamandat.letzteVerwendung
, Person.PersonId as persId
, Partner.partnerid as partId
FROM (Partner INNER JOIN Person
ON PersonId = persid)
INNER JOIN (Konto
INNER JOIN (Sepamandat
INNER JOIN Leistung
ON Sepamandat.KontoID = Leistung.KontoID)
ON Konto.KontoId = Sepamandat.KontoID)
ON PartID = Konto.KontoInhaber
WHERE (((Leistung.Leistungsart)=1) AND ((Leistung.LeistungStatus)=1) AND ((Sepamandat.SEPAMandatStatus)=1) AND ((Leistung.AktuellerBetrag)>0) AND ((Konto.KontoStatus)=1) AND ((Konto.KontoArt)=2) AND (([saldo]*-1)>0))
ORDER BY Person.NachName;

Die Fehlermeldung ist:

Nachricht 208, Stufe 16, Status 1, Prozedur qryleistungsepaperson, Zeile 17 [Batchstartzeile 0]
Ungültiger Objektname "Partner".

Es gibt aber eine Partnertabelle, schwör ich bei meinem Bart! Darin sind die Spalten Personid, Partnerid, Rolleid

Danke für Hilfe!

Martin
 
Zuletzt bearbeitet:
Werbung:
FROM (Partner INNER JOIN Person
ON PersonId = persid)
Der Ausdruck in Klammern "versteckt" die Partnertabelle. Du musst bei geklammerten Subselects einen Alias definieren und entsprechend im weiteren Statement verwenden.
Die bloße Existenz eines Objects garantiert nicht den Zugriff. Es muss in From clause oder CTE angegeben bzw benannt werden und natürlich unter Zugriffsbetechtigung stehen.
Ich glaube nur Funktionen und Prozeduren können direkt angesprochen werden. (bei Zugriffsbetrechtigung)
 
dann sollte das ganze so aussehen

Code:
CREATE VIEW qryleistungsepaperson AS
SELECT TOP (1000)
    Leistung.LeistungId,
    Leistung.Leistungsart,
    Leistung.LeistungStatus,
    Leistung.AktuellerBetrag,
    Sepamandat.merkmal,
    Sepamandat.SEPAMandatStatus,
    Leistung.AktuellerBetrag,
    Konto.KontoStatus,
    Konto.KontoArt,
    Konto.saldo * -1 AS Betrag,
    Person.NachName,
    Person.Vorname,
    Konto.IBAN,
    Sepamandat.letzteVerwendung,
    Person.PersonId AS persId,
    Partner.partnerid AS partId
FROM
    Partner
INNER JOIN
    Person ON Person.PersonId = Partner.persId
INNER JOIN
    Konto ON Partner.partnerid = Konto.KontoInhaber
INNER JOIN
    Sepamandat ON Konto.KontoId = Sepamandat.KontoID
INNER JOIN
    Leistung ON Sepamandat.KontoID = Leistung.KontoID
WHERE
    Leistung.Leistungsart = 1
    AND Leistung.LeistungStatus = 1
    AND Sepamandat.SEPAMandatStatus = 1
    AND Leistung.AktuellerBetrag > 0
    AND Konto.KontoStatus = 1
    AND Konto.KontoArt = 2
    AND Konto.saldo * -1 > 0
ORDER BY
    Person.NachName;
 
MDDaniel, du hast mich duchschaut! Ich gestehe!

Ich bedanke mich herzlich, ich habe etwas gelernt!
Es sind noch ein paar andere Rätselsqls da...aber nach und nach.
Prinzipiell läuft die Migration auf Sql von Access aber ganz gut.
Wenn Interesse besteht, kann ich mal meine gesammelten Erfahrungen aufschreiben.

Ein paar Kleinigkeiten gab es noch, aber so ist sie jetzt abgelegt:

CREATE VIEW qryleistungsepaperson AS
SELECT TOP (1000)
Leistung.LeistungId,
Leistung.Leistungsart,
Leistung.LeistungStatus,
Leistung.AktuellerBetrag,
Sepamandat.merkmal,
Sepamandat.SEPAMandatStatus,
Konto.KontoStatus,
Konto.KontoArt,
Konto.saldo * -1 AS Betrag,
Person.NachName,
Person.Vorname,
Konto.IBAN,
Sepamandat.letzteVerwendung,
Person.PersonId AS persId,
Partner.partnerid AS partId
FROM
Partner
INNER JOIN
Person ON person.PersonId = Partner.personid
INNER JOIN
Konto ON Partner.partnerid = Konto.KontoInhaber
INNER JOIN
Sepamandat ON Konto.KontoId = Sepamandat.KontoID
INNER JOIN
Leistung ON Sepamandat.KontoID = Leistung.KontoID
WHERE
Leistung.Leistungsart = 1
AND Leistung.LeistungStatus = 1
AND Sepamandat.SEPAMandatStatus = 1
AND Leistung.AktuellerBetrag > 0
AND Konto.KontoStatus = 1
AND Konto.KontoArt = 2
AND Konto.saldo * -1 > 0
ORDER BY
Person.NachName;

Ich muss mich da noch tiefer einlesen, bemerkenswert finde ich, das in der From Klausel nur die Partner Tabelle auftaucht und ganzen anderen Tabellen, die in den Join Bedingungen stehen, dort nicht aufgeführt sind.
Grüße aus dem sehr warmen SE-Asien!

Martin
 
Hi,

hier ist die nächste View. ich habe mich an das obige Schema gehalten, aber etwas stört ihn noch:

create view qrypersonmahnungstufe3 as SELECT Konto.saldo
, Leistung.Mahnungsstufe
, Leistung.KontoID
, Leistung.LeistungId
, Konto.KontoArt
, Person.NachName
, Person.Vorname
, Person.PersonId
, Person.Strasse
, Person.PLZ
, Person.Ort
FROM Person
INNER JOIN
Person ON Person.PersonId = Partner.personId
INNER JOIN
Konto ON Konto.KontoId = Leistung.KontoID
INNER JOIN
partner on partner.PartnerID = Leistung.LeistungAuftraggeber
WHERE Konto.saldo < 0
AND Leistung.Mahnungsstufe = 3
AND Konto.KontoArt = 1

Fehler:

Nachricht 1013, Stufe 16, Status 1, Prozedur qrypersonmahnungstufe3, Zeile 1 [Batchstartzeile 0]
Die Objekte "Person" und "Person" in der FROM-Klausel haben denselben verfügbar gemachten Namen. Verwenden Sie abhängige Namen, um sie voneinander zu unterscheiden.

Danke für Hilfe!

Martin
 
Du joinst die Tabelle Person mit sich selbst. Das geht, allerdings können nicht beide Tabellen Person heißen sondern müssen eindeutig sein. Da hilft nur ein Tabellen-Alias für mindestens eine der beiden Tabellen. In der Join-Condition verwendest du schon Partner.personId, der Alias Partner wurde aber nicht definiert.
INNER JOIN
Person Partner ON Person.PersonId = Partner.personId
 
Hi ukulele,

danke für den Hinweis...jetzt passt es:

create view [dbo].[qrypersonmahnungstufe3] as SELECT Konto.saldo
, Leistung.Mahnungsstufe
, Leistung.LeistungId
, Leistung.Kontoid
, Konto.KontoArt
, Person.NachName
, Person.Vorname
, Person.PersonId
, Person.Strasse
, Person.PLZ
, Person.Ort
FROM Partner
INNER JOIN
Person ON Person.PersonId = Partner.personId
INNER JOIN
Leistung on partner.PartnerID = Leistung.LeistungAuftraggeber
INNER JOIN
Konto ON Konto.KontoId = Leistung.KontoID


WHERE Konto.saldo < 0
AND Leistung.Mahnungsstufe = 3
AND Konto.KontoArt = 1

Da hatte ich wohl was verwechselt...

Danke noch mal!
 
Hallo,

aufbauend auf den ersten Post, habe ich schon einige Abfragen SQL-Server gerecht umgestellt.
Aber bei dieser komme ich nicht weiter:

create view qryleistungsdetails as
SELECT
Person.NachName
, Person.Vorname
, Person.PersonId
, Leistung.LeistungId
, Leistung.LeistungAuftraggeber
, Leistung.Beginn
, Leistung.Ende
, Leistung.Betrag
, Leistung.KündigungAm
, Leistung.KündigungZum
, Leistung.Sonderregelung
, Leistung.Pauschalzahlung
, Leistung.Mahnungsstufe
, Leistung.Mahnungsdatum1
, Leistung.Mahnungsdatum2
, Leistung.Mahnungsdatum3
, Leistung.Mahnungsdatum4
, Leistung.LetzteÄnderung
, Leistung.Bemerkungen
, Leistung.Ruhtvom
, Leistung.Ruhtbis
, Leistung.Erfassungsdatum
, Leistung.LeistungStatus
, Leistung.AktuellerBetrag
, Leistung.Leistungsart
, Leistung.Sonderrabatt
, Leistung.KontoID
, Leistung.sendTerminate
, Leistung.sendSuspension
, Leistung.sendChanges
, SVZLeistungsart.LeistungsArtId
, SVZLeistungsart.LeistungsArt
, SVZleistungStatus.LeistungsstatusID
, SVZleistungStatus.LeistungStatus

FROM Leistung

INNER Join
Partner ON Partner.PartnerID = Leistung.LeistungAuftraggeber

INNER Join
Person ON Person.PersonId = Partner.PersonId

INNER Join
SVZLeistungsstatus ON SVZleistungStatus.LeistungsstatusID = Leistung.LeistungStatus

INNER Join
SVZLeistungsart ON SVZLeistungsart.LeistungsArtId = Leistung.Leistungsart

Die Fehlermeldung sagt:

Nachricht 208, Stufe 16, Status 1, Prozedur qryleistungsdetails, Zeile 38 [Batchstartzeile 0]
Ungültiger Objektname "Leistung".

Zeile 38 ist die From Klausel.
Leistung ist eine Tabelle mit vielen Attributen, Person (verknüpft über eine Partnertabelle) und zwei Schlüsselverzeichnisse. Ob jetzt wirklich alle Spalten gebraucht werden, sei jetzt mal dahingestellt, trotzdem bleibt für mich die Fehlermeldungs unverständlich.

Danke für Hilfe

Martin
 
Auf dem Server geht glaube ich Select * nicht, aber ich kann mir die ersten 200 Zeilen ansehen. In Access als Abfrage klappt select * from Leistung. Die Tabelle ist also eindeutig da und mit Daten gefüllt.
 
Auf dem Server geht glaube ich Select * nicht
Glaubst Du?
Es gibt keinen Grund warum "Select * from Leistung" nicht funktionieren sollte, außer es gibt die Tabelle nicht (in der Schreibweise) oder Dir fehlen die Zugriffsrechte.
In Access als Abfrage klappt select * from Leistung. Die Tabelle ist also eindeutig da und mit Daten gefüllt.
Also wenn es in Access funktioniert und Access bei dieser Abfrage eine verknüpfte Tabelle aus dem Server anspricht, dann muss es auch auf dem Server funktionieren.

Außerdem beinhalten die andere Abfragen von Dir weiter oben bereits die Tabelle. Wenn es dort geht, warum dann nicht auch hier?

Was auffällt, Deine Create View Anweisung sieht diesmal anders aus, als in den vorigen Beispielen.
Du hast diesmal kein User Schema angegeben. (dbo)
Du kannst versuchen, ob das Select Statement ohne Createanweisung funktioniert.
Du kannst prüfen, ob Du als der richtige Nutzer angemeldet bist / warst.

Was ich nicht verstehe, warum die Fehlermeldung sagt :
Nachricht 208, Stufe 16, Status 1, Prozedur qryleistungsdetails
Du erzeugst einen View, aber die Fehlermeldung sagt "Prozedur". Vielleicht ist das normal bei MSSQL, aber irritierend.
 
Hi,

die query kam ja aus Access. Ich habe jetzt mal die View auf dem Server erzeugt und da klappt es.
Er hat nur zwei Aliase eingefügt und das dbo. überall davor gesetzt, aber ansonsten ist die Fraum Klausel identsich.
Aber da kann ich mit leben...
Ich versteh es zwar immer noch nicht, aber ich habe eine Lösung.

Nochmal Danke!

CREATE VIEW [dbo].[qryleistungsdetails2]
AS
SELECT dbo.Leistung.LeistungId
, dbo.Leistung.LeistungAuftraggeber
, dbo.Leistung.KontoID
, dbo.Leistung.Beginn
, dbo.Leistung.Ende
, dbo.Leistung.Leistungsart
, dbo.Leistung.Betrag
, dbo.Leistung.AktuellerBetrag
, dbo.Leistung.KündigungAm
, dbo.Leistung.KündigungZum
, dbo.Leistung.Sonderregelung
, dbo.Leistung.Sonderrabatt
, dbo.Leistung.Pauschalzahlung
, dbo.Leistung.Mahnungsstufe
, dbo.Leistung.Mahnungsdatum1
, dbo.Leistung.Mahnungsdatum2
, dbo.Leistung.Mahnungsdatum3
, dbo.Leistung.Mahnungsdatum4
, dbo.Leistung.Bemerkungen
, dbo.Leistung.LetzteÄnderung
, dbo.Leistung.Ruhtvom
, dbo.Leistung.Erfassungsdatum
, dbo.Leistung.LeistungStatus
, dbo.Leistung.Ruhtbis
, dbo.Leistung.sendTerminate
, dbo.Leistung.sendSuspension
, dbo.Leistung.sendChanges
, dbo.SVZLeistungsart.LeistungsArtId
, dbo.SVZLeistungsart.LeistungsArt AS Expr1
. dbo.SVZleistungStatus.LeistungsstatusID
, dbo.SVZleistungStatus.LeistungStatus AS Expr2
, dbo.Person.NachName
, dbo.Person.Vorname

FROM dbo.Leistung
INNER JOIN
dbo.SVZLeistungsart ON dbo.Leistung.Leistungsart = dbo.SVZLeistungsart.LeistungsArtId
INNER JOIN
dbo.SVZleistungStatus ON dbo.Leistung.LeistungStatus = dbo.SVZleistungStatus.LeistungsstatusID
INNER JOIN
dbo.Partner ON dbo.Leistung.LeistungAuftraggeber = dbo.Partner.PartnerID
INNER JOIN
dbo.Person ON dbo.Partner.PersonId = dbo.Person.PersonId
 
Hi dabadepdu

Danke für deine Antwort.
Da ich die Anwendung in der Phase der Entwicklung lokal betreibe, kann ich nur der richtige User sein, andere gibt es nicht.
Ich vermute jetzt mal, das es an dem [dbo] lag, wie oben beschrieben, habe ich die View jetzt auf dem Server erzeugt und es hat geklappt.
Es werden aber noch einige Views folgen, dann werde ich der Sache auf den Grund gehen.
Das Thema mit den Abfragen ist wirklich mühselig, man muss sie Abfrage für Abfrage umstellen und testen und wenn man sie einmal umgestellt hat, sind sie zu Access nicht abwärtskompatibel, es geht also nur nach vorne!
Heute bin ich noch auf ein Problem gestoßen, wofür ich noch keine Lösung habe:

Die Anwendung ist für eine Ballettschule. In dieser gibt es Kurse. Vor allem für kleine Kinder, haben Kurse ein Altersintervall, welches beschreibt, für welches Alter dieser Kurs gilt.

Kurs: alter von, Alter bis, Key: Kursid

Diese Kurse besuchen nun Kinder, die ein Geburtsdatum haben: Person: gebdat, Key: personid
Es gibt eine Tabelle Kursbelegung mit Personid und Kursid.
Ist es möglich, rein mit SQL_Mitteln zu ermitteln, ob eine Kursbelegung vom Alter her passt oder nicht, also ob das Kind vom Alter her in das Intervall des Kurses passt? Also in einer Spalte "checkage" dann dieser Boolsche Wer steht?
In Access hatte ich dafür eine kleine Prozedur geschrieben, die de Bool Wert ermittelte, also passt oder passt nicht.
Wie würde man das auf dem Server machen?

Dank!

Martin
 
Werbung:
Da ich die Anwendung in der Phase der Entwicklung lokal betreibe, kann ich nur der richtige User sein, andere gibt es nicht.
Du musst Dir mal die Konstruktion klar machen, die Du da aufbaust. Access ist eine eigene Welt und wird es bleiben, bis auf das Feature, dass man externe DB einbinden kann. Es ist bekannt dafür, dass es nicht besonders kompatibel zu SQL ist und an einigen Stellen eigene Wege geht.
Wenn man einen Server einsetzt, legt man dort das Datenmodell an. Das beinhaltet natürlich Tabellen, Trigger, Stored Procedures, Views usw.
Das macht man am besten und elegantesten auf dem Server selbst (deswegen wird er so genannt) bzw. mit einem Tool, dass es nativen Serverzugriff ermöglicht. Access ist ein möglicher Client von vielen und was Du jetzt dort einbaust (bzw. aus Unwissenheit über Access abwickelst), musst Du ggF. in Frage stellen, wenn Du den Access Client an irgendjemand auslieferst (falls es so gedacht ist).
Ein Weg in Access nativ auf den Server zuzugreifen sind Pass Through Queries. (Ich habe noch nie über Access einen View auf einem Server angelegt, obwohl ich jahrelang mit Access und Servern zu tun hatte). Es ist bestimmt ein gutes Vorgehen, das Erzeugen des Datenmodells vollkommen unabhängig von Access vorzunehmen.
Ein (DB)Server kann in vielen Kontexten mit verschiedenen Nutzern angesprochen werden. Dafür können SQL User aber auch Windows User verwendet werden, letzteres ist in Deinem Fall wahrscheinlich nicht sinnvoll.
Dein Geburtstagsproblem stellst Du am besten in einem separaten Thread bereit. Alle Fragen, die sich um Geburtstage und ähnliches drehen, baut man am besten nicht in statische Spalten ein. Denn das Problem ist nicht statisch. Wer heute in Schema F passt, weil er noch 10 ist, hat morgen Geburtstag und gehört in Schema G. Das aktuelle Alter lässt sich immer einfach in Abfragen "on-the-fly" errechnen und weiterverarbeiten oder als Abfragekriterium einsetzen.
 
Zurück
Oben