Select zum Testen der Tabellen-Existenz

derhenry

Fleissiger Benutzer
Beiträge
54
Moin!
Um zu überprüfen, ob eine Tabelle existiert und der Anwender die nötigen Rechte hat, setze ich per Makro dieses Statement ab:
select top 1 * from...

Da die Tabelle recht groß ist und ein Ergebnis erst nach über einer Minute zurückkommt, bekomme ich in anderen Anwendungen leider Timeouts.
Habt Ihr eine Idee, wie ich obiges Ziel schneller erreichen kann?

Danke und Grüße
derhenry
 
Werbung:
Hey,
danke für das Feedback. Wie mache ich das? Hat da ein Standardanwender (von dessem Rechner die Prüfung automatisch erfolgt) dort Zugriff drauf und lässt sich am Feedback unterscheiden, ob die Tabelle nicht da oder nur für den Anwender nicht verfügbar ist?
 
Cool, funktioniert auch bei MS-SQL. Ich bekomme bei einem gültigen Tabellennamen eine 1, bei einem ungültigen eine 0 zurück.
Jetzt bin ich aber auch der Tabelleninhaber. Es lässt sich hiermit also nicht erkennen, ob die Tabelle nicht da oder nicht freigegeben ist.
Aber danke!
 
Wiso dauert denn ein SELECT TOP 1 * FROM tabelle solange? Das liefert doch nur eine (beliebige) Zeile zurück, das darf eigentlich nicht lange dauern, egal wie groß die Tabelle ist.
 
Wiso dauert denn ein SELECT TOP 1 * FROM tabelle solange?
Tja, das ist eine gute Frage. War mir auch neu. Welchen Wert ich zurückbekomme wäre mir auch in der Tat egal.
Vielleicht liegt es daran, dass ich auf einen View abfrage? Wenn ich das bei einem kleinen View (etwa 1000 Zeilen) mache, geht es recht fix. Bei 80000000 dauert es aber leider. :(
 
Dann dürfte sich das Problem auch in anderen Abfragen bemerkbar machen, eventuell solltest du deine View überarbeiten oder ihren Einsatz überdenken.
 
Der View ist schon nicht der schnellste, aber für seine Zwecke optimiert und unersätzlich. Es werden einige Tabellen miteinander verknüpft.
Bei der regulären Abfrage ist eine Antwortzeit von einer Minute auch in Ordnung. Wie gesagt, möchte ich aber für einen anderen Prozess lediglich die Verbindung prüfen und gehe da mit obigen Query auf den View. Somit überprüfe ich ja auch die Verbindung (und die Rechte des Anwenders) für alle im View angesprochenen Tabellen.
Etwas besseres fällt mir somit nicht ein. :(
Trotzdem danke!
 
Du könntest statt auf die View zu gehen auf die Tabelle(n) gehen und dort einen Select machen, sollte den gleichen Nutzen haben und immernoch schneller sein.
 
Hallo,

um die Existenz eines Objekts zu prüfen, kann man folgendes Statement benutzen:

Code:
SELECT OBJECT_ID('[Datenbank].[Schema].[Tabellenname]') as OID

Generell funktioniert das auch mit
Code:
SELECT TOP 1 * FROM ...
, aber das ist natürlich langsamer, da das Ergebnis alle Spalten für der Tabelle ausliest.
Schneller sollte das gehen, wenn man nicht "SELECT *" benutzt sondern nur die PKEY-Spalte(n) der Tabelle ausliest (wegen Index!).

Viele Grüße,
Tommi
 
Hi,

noch ein Nachtrag. Mit
Code:
SELECT OBJECT_ID ('[Datenbank].[Schema].[Tabellenname]')
lässt sich leider nicht die Berechtigung auf das Objekt prüfen!

Viele Grüße,
Tommi
 
Werbung:
Danke für den Hinweis. Die Existenz der Tabelle setze ich eigentlich vorraus. Wichtiger ist zu prüfen, ob sie für den jeweiligen Anwender sicht- und lesbar ist.
 
Zurück
Oben