none
Select-Statement mit Object-ID RRS feed

  • Frage

  • Ich habe eine Fragen hinsichtlich eines Select-Statements. Ein gewöhnliches Statement hat die Form select * from Tabelle. So weit so gut. Jede Tabelle hat eine ID, die ich mit

    select

    OBJECT_ID(N'DATENBANK.SCHEMA.Tabelle')asID

    ermitteln kann. Gibt es eine Möglichkeit das Statment in der Form

    select * from OBJECT_ID(N'DATENBANK.SCHEMA.Tabelle') darzustellen?

    Dienstag, 12. Juli 2016 09:32

Antworten

  • Hallo,

    Nein. Was Du machen kannst ist, den (tunlichst qualifizierten) Namen der Tabelle darüber ermitteln und das Ganze in EXEC zu verpacken, aber auch das ist bescheiden.

    SQL ist eine vollwertige Sprache und kein Scripting Hilfsmittelchen. Bereits "*" sollte vermieden werden und eine explizite Spaltenliste angegeben werden. Nur so kann ein effizienter Ausführungsplan generiert werden (und spätere Fehler in nutzenden Programmen vermieden werden, wenn sich die Spaltenanzahl oder -reihenfolge ändert). Zudem wird sich die Object_id bei einer Neuanlage einer Tabelle (DROP ... CREATE) ändern.

    Gruß Elmar

    Dienstag, 12. Juli 2016 09:51

Alle Antworten

  • Hallo,

    Nein. Was Du machen kannst ist, den (tunlichst qualifizierten) Namen der Tabelle darüber ermitteln und das Ganze in EXEC zu verpacken, aber auch das ist bescheiden.

    SQL ist eine vollwertige Sprache und kein Scripting Hilfsmittelchen. Bereits "*" sollte vermieden werden und eine explizite Spaltenliste angegeben werden. Nur so kann ein effizienter Ausführungsplan generiert werden (und spätere Fehler in nutzenden Programmen vermieden werden, wenn sich die Spaltenanzahl oder -reihenfolge ändert). Zudem wird sich die Object_id bei einer Neuanlage einer Tabelle (DROP ... CREATE) ändern.

    Gruß Elmar

    Dienstag, 12. Juli 2016 09:51
  • Das habe ich befürchtet. Also Sinn dieser Frage ist dynamisches SQL zu vermeiden und somit keine Injektion zu ermöglichen.  Da die EXEC-Funktionalität auch nicht in Funktion etc. benutzt werden kann gibt es nach meiner Kenntnis keinen variablen Weg ala DLookup Daten abzufragen (wie es z. B. in MS Access möglich ist). Dann ist wohl der Gedanke zu verwerfen. Danke für die schnelle Antwort.

    Gruß Thomas

    P. S. Wie schließe ich das Thema?

    Dienstag, 12. Juli 2016 11:25
  • Hallo Thomas,

    P. S. Wie schließe ich das Thema?

    Indem Du den Beitrag, der Deine Frage beantwortet, als Lösung kennzeichnest (unter dem Beitrag Als Antwort markieren).

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 12. Juli 2016 12:39
    Moderator
  • Hallo Thomas,

    Der Beitrag, der die gestellte Frage beantwortet, ist hier Elmars Beitrag und er wurde demzufolge von Benjamin als Antwort vorgeschlagen. Würdest Du ihn markieren?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Dienstag, 12. Juli 2016 13:53
    Moderator
  • Hallo Thomas,

    das zu machen um SQL Injection zu vermeiden ist lohnt nun wirklich nicht. Implementiere bzw. verwende Methoden wie QUOTENAME und das Problem sollte keines mehr sein. Dies auch für die Parameter einer (eigenen) DLOOKUP Implementation bzw. dort so weit wie möglich sp_executesql und Parameter verwenden.

    Allerdings ist ein DLOOKUP wie in Access bei einer SQL Server Datenbank problematischer, da die Aufrufe komplexer (langsamer) sind. Ein intensiver Einsatz sollte gut überlegt werden und wo immer möglich setbasierte Abfragen verwendet werden.

    So kann ein SELECT ID, (SELECT Name FROM IDTabelle WHERE IDTabelle.ID = Tabelle.ID) AS IdName FROM Tabelle u. U. günstiger sein, wenn mehrere Zeilen abgefragt werden - anstatt Unterabfrage können dabei auch JOINs, APPLY uam. eingesetzt werden.

    Gruß Elmar


    • Bearbeitet Elmar Boye Dienstag, 12. Juli 2016 14:22
    Dienstag, 12. Juli 2016 14:22