|
Erweiterte gespeicherte Prozeduren
Datei- und Verzeichnisfunktionen
Für das Auflisten von Laufwerken, Verzeichnissen und Dateien
stellt der SQL Server eine Reihe (meist undokumentierter) erweiterter gespeicherter Prozeduren
zur Verfügung.
Auflisten aller Festplatten-Laufwerke
Syntax:
EXEC master.dbo.xp_fixeddrives [laufwerkstyp]
Ergebnis:
2-spaltiges Resultset mit Laufwerksbuchstabe und Anzahl der freien MB auf dem Laufwerk
Parameter:
[laufwerkstyp] | Der Laufwerkstyp. Mögliche Werte:
0 = Festplatten
1=Verbundene Netzlaufwerke
2=Floppy/Zip-Laufwerke
Alle anderen Werte geben die Festplattenlaufwerke zurück. |
Beispiel: Anzeigen aller Festplattenlaufwerke auf dem Server mit weniger als 500 MB freiem Speicherplatz
CREATE TABLE #laufwerke(lw char(1), MB_frei int) INSERT INTO #laufwerke EXEC master..xp_fixeddrives SELECT * FROM #laufwerke WHERE MB_frei < 500 DROP TABLE #laufwerke GO
Auflisten aller bereiten Laufwerke
Mit Hilfe der erweiterten gespeicherten Prozedur xp_availablemedia kann eine
Liste aller verfügbaren Laufwerke ermittelt werden. Dabei können auch CD-ROM/DVD-Laufwerke ermittelt werden.
Syntax:
EXEC master.dbo.xp_availablemedia [laufwerkstyp]
Ergebnis:
4-spaltiges Resultset mit Laufwerksbuchstabe Anzahl der freien Bytes (High/Low) auf dem Laufwerk und Laufwerkstyp.
Parameter:
[laufwerkstyp] | Der Laufwerkstyp. Mögliche Werte:
nicht angegeben=alle Laufwerke
1=Floppy-Laufwerke und Festplatten
2=Festplatten
8=DVD/CD-ROM Laufwerke
|
Beispiel: Anzeigen aller bereiten CD-ROM/DVD-Laufwerke auf dem Server
EXEC master.dbo.xp_availablemedia 8
Beispiel für Ergebnis:
/*-----------------------------
EXEC master.dbo.xp_availablemedia 8
-----------------------------*/
name low free high free media type
-------------- ----------- ----------- ----------
F:\ 0,00 0,00 8,00
G:\ 0,00 0,00 8,00
Auflisten eines Verzeichnisbaums mit und ohne Dateien
Die erweiterte gespeicherte Prozedur xp_dirtree bietet eine einfache Möglichkeit den Inhalt von Unterverzeichnisssen auf dem SQL Server zu ermitteln.
Als Parameter können die Suchtiefe und die Art der Ergebnisrückgabe (nur Verzeichnisse oder Verzeichnisse und Dateien) festgelegt werden.
Syntax:
EXEC master.dbo.xp_dirtree verzeichnis, [suchtiefe], [suchart]
Ergebnis:
2- bzw. 3-spaltiges Resultset mit Ordner/Dateiname und Suchtiefe. Wurde das suchart-Flag auf einen Wert ungleich 0 gesetzt,
so wird außerdem in einer dritten Spalte angegeben, ob es sich um ein Verzeichnis oder eine Datei handelt.
Parameter:
verzeichnis | Lokaler Pfad des zu durchsuchenden Verzeichnisses |
suchtiefe | Integer-Wert, der angibt wieviele Ebenen von Verzeichnissen durchsucht werden sollen. |
verzeichnis | Flag, das festlegt, ob lediglich Ordner oder auch Dateien aufgenommen werden sollen.
Mögliche Werte:
0 - Standardwert, es werden nur Verzeichnisse gesucht
1 - Es werden auch Dateien gesucht |
Beispiel: Auflisten aller EXE-Dateien im Verzeichnis C:\WINNT
CREATE TABLE #dir(datei_dir varchar(255), tiefe int, ist_datei int) INSERT INTO #dir EXEC master..xp_dirtree 'C:\winnt', 1, 1 SELECT datei_dir As Exe_Datei FROM #dir WHERE ist_datei = 1 AND RIGHT(datei_dir, 3) = 'exe' ORDER BY datei_dir DROP TABLE #dir
Auflisten aller Unterverzeichnisse eines Verzeichnisses
Sollen nur die direkten Unterverzeichnisse eines Verzeichnisses schnell ermittelt werden, bietet sich die Prozedur
xp_subdirs an. Diese Prozedur erwartet als Parameter das zu durchsuchende Verzeichnis.
Syntax:
EXEC master.dbo.xp_subdirs verzeichnis
Ergebnis:
Einspaltiges Resultset mit den Namen der gesuchten Unterverzeichnisse
Parameter:
verzeichnis | Lokaler Pfad des zu durchsuchenden Verzeichnisses |
Beispiel: Auflisten aller Unterverzeichnisse von C:\WINNT
EXEC master..xp_subdirs 'c:\winnt'
Ermitteln der Attribute, Größe, etc. einer Datei
Mit Hilfe der gespeicherten Prozedur xp_getfiledetails können Informationen wie Dateiattribute, Datum des letzten Zugriffs, Erstelldatum, etc. über eine Datei abgefragt werden.
Syntax:
EXEC master.dbo.xp_getfiledetails verzeichnis_oder_datei
Ergebnis:
Mehrspaltiges Resultset mit den Alternativen Namen der Datei, den Dateiattributen, dem Datum und Zeitpunkt der Dateierstellung, Datum und Zeitpunkt des letzten Zugriffs und Datum und Zeitpunkt der letzte Änderung sowie der Größe der Datei in Bytes.
Parameter:
verzeichnis_oder_datei | Vollständiger Name einer lokalen Datei oder eines lokalen Verzeichnisses |
Beispiel: Ermitteln der Dateiinformationen für die Datei Boot.ini (Attributwerte werden sprechend dargestellt)
IF OBJECT_ID('sp_getDateiInfo', 'P') IS NOT NULL DROP PROC sp_getDateiInfo GO CREATE PROC sp_getDateiInfo @dateiname varchar(255) AS SET NOCOUNT ON SET CONCAT_NULL_YIELDS_NULL ON -- Erstellen einer Hilfstabelle für das Ergebnis von xp_getfiledetails CREATE TABLE #dateiinfo ( altname varchar(255), groesse int, erstelldatum varchar(8), erstellzeit int, zuletztgeschriebendatum varchar(8), zuletztgeschriebenzeit int, zuletztZugriffDatum varchar(8), zuletztZugriffZeit int, Attribute int ) -- Füllen der Hilfstabelle INSERT INTO #dateiinfo EXEC xp_getfiledetails @dateiname -- Ergebnis aufbereiten (Datum und Zeit zusammenfassen) SELECT altname AS [Alternativer Name], groesse / 1024 AS GroesseKB, DATEADD (second, (erstellzeit / 10000 % 100) * 3600 + -- Stunden (erstellzeit / 100 % 100) * 60 + -- Minuten erstellzeit % 100, -- Sekunden CAST(erstelldatum AS datetime)) AS Erstellt, DATEADD (second, (zuletztgeschriebenzeit / 10000 % 100) * 3600 + -- Stunden (zuletztgeschriebenzeit / 100 % 100) * 60 + -- Minuten zuletztgeschriebenzeit % 100, -- Sekunden CAST(zuletztgeschriebendatum AS datetime)) AS [Geändert am], DATEADD (second, (zuletztZugriffZeit / 10000 % 100) * 3600 + -- Stunden (zuletztZugriffZeit / 100 % 100) * 60 + -- Minuten zuletztZugriffZeit % 100, -- Sekunden CAST(zuletztZugriffDatum AS datetime)) AS [Letzter Zugriff], Attribute, SPACE(255) AS Attributbeschreibung INTO #dateiinfo_aufbereitet FROM #dateiinfo -- Hilfstabelle für Dateiattribute erstellen und füllen CREATE TABLE #dateiattribute (att int, beschreibung varchar(30)) INSERT INTO #dateiattribute VALUES (1, 'Schreibgeschützt') INSERT INTO #dateiattribute VALUES (2, 'Versteckt') INSERT INTO #dateiattribute VALUES (4, 'System') INSERT INTO #dateiattribute VALUES (8, 'Volume') INSERT INTO #dateiattribute VALUES (16, 'Verzeichnis') INSERT INTO #dateiattribute VALUES (32, 'Archiv') INSERT INTO #dateiattribute VALUES (64, 'Alias') -- Aktualisieren der Spalte Attributbeschreibung mit sprechendem Text DECLARE @attSprechend varchar(255) SELECT @attsprechend = ISNULL(@attSprechend + ', ' + beschreibung, beschreibung) FROM #dateiinfo_aufbereitet da INNER JOIN #dateiattribute a ON (attribute & att) = att UPDATE #dateiinfo_aufbereitet SET Attributbeschreibung = @attsprechend -- Ergebnis anzeigen SELECT * FROM #dateiinfo_aufbereitet GO EXEC sp_getDateiInfo 'C:\boot.ini'
Prüfen, ob eine Datei oder ein Verzeichnis existiert
Die Prozedur xp_fileexist prüft, ob eine Datei auf dem Server existiert. Dabei kann das Ergebnis als OUTPUT-Variable
oder als Resultset zurückgegeben werden.
Syntax:
EXEC master.dbo.xp_fileexist verzeichnis_oder_datei [, ergebnis OUTPUT]
Ergebnis:
Wird der Ausgabeparameter ergebnis angegeben, enthält dieser den Wert 1, falls die Datei existiert.
Wird nur der Dateiname angegeben, so wird ein 3-spaltiges Resultset mit den Spalten "Datei existiert", "Datei ist ein Verzeichnis" und "Übergeordnetes Verzeichnis existiert".
Parameter:
verzeichnis_oder_datei | Vollständiger Name einer lokalen Datei oder eines lokalen Verzeichnisses |
[ergebnis OUTPUT] | Rückgabeparameter, der angibt, ob die Datei existiert. (0=nein, 1=ja) |
Beispiel: Prüfen, ob die Datei C:\WINNT\NOTEPAD.EXE auf dem Server existiert
DECLARE @datei_vorhanden int EXEC master..xp_fileexist 'c:\winnt\notepad.exe', @datei_vorhanden OUTPUT IF @datei_vorhanden = 1 PRINT 'Datei existiert' ELSE PRINT 'Datei existiert nicht.'
|