Oftmals ist es hilfreich komplette Tabellen programmatisch auszulesen und zu verarbeiten.
Ausgeführt werden alle Queries gegen ein MS SQL DBMS auf einem Ubuntu Server. Insgesamt sind die Linux Ports des MS SQL Servers sehr kompatibel zur ursprünglichen Windows Installation.
sys.tables
Zunächst sind alle definierten Tabellen innerhalb sys.tables zu finden.
SELECT * FROM sys.tables as tables WHERE tables.name IS NOT NULL
Wie sicherlich bereits vermutet, repräsentiert das Feld name den Namen der Tabelle. Für weitere Verarbeitung ist allerdings das Feld object_id zur eindeutigen Identifizierung nötig.
SELECT tables.object_id FROM sys.tables as tables WHERE tables.name = 'nameOfTheTable'
sys.columns
Nachfolgend finden sich innerhalb der sys.columns alle Spaltendefinition.
SELECT columns.* FROM sys.columns as columns WHERE columns.object_id = 'theObjectId'
Wie zuvor angeführt, kann object_id genutzt werden, um alle Spalten einer Tabelle zu referenzieren.
sys.columns and sys.tables in conjunction
Um nun alle Spalten einer Tabelle anhand des Tabellennamens anzufragen, kann nachfolgende Query genutzt werden.
SELECT cols.* FROM sys.tables as tables INNER JOIN sys.all_columns as cols ON cols.OBJECT_ID = tables.OBJECT_ID WHERE tables.name = 'nameOfTheTable'
SELECT columns.name AS 'Name', columns.system_type_id AS 'Datatype' FROM sys.tables as tables INNER JOIN sys.all_columns as columns ON columns.object_id = tables.object_id WHERE tables.name = 'nameOfTheTable'
sys.types
Nun finden sich innerhalb sys.types alle Typendefinitionen. Zum Abschluss dieses Beitrags hier eine Query, welche Spaltennamen, Datentyp und maximale Länge einer jeden Spalte einer definierten Tabelle anfragt.
SELECT columns.name AS 'Name', types.name AS 'Datatype', columns.max_length AS 'Length' FROM sys.tables as tables INNER JOIN sys.all_columns as columns ON columns.object_id = tables.object_id INNER JOIN sys.types as types ON columns.system_type_id = types.system_type_id WHERE tables.name = 'nameOfTheTable'