Hallo liebe Entwicklerforum-Mitglieder,
ich stehe gerade vor einem Problem und weiss nicht weiter. Unszwar habe ich ein SQL-Programm geschrieben, was den Speicher aller Tabellen in einer Datenbank ermitteln soll.
Eine Tabelle soll in der DB angelegt werden, die folgende Spalten haben soll (diese habe ich gemacht):
- DB_name
- Schema_name,
- Table_name,
- Row_Count (Anzahl Datensätze),
- Column_Quantitiy (Anzahl Spalten),
- Data_Space_used
- Index_Space_used,
- Unused_Space_used
- Date (Wann zuletzt die Abfrage gemacht wurde)
Dann habe ich für die Ermittlung der Tabellenspeicher folgendes Programm geschrieben.
ich habe in meiner Datenbank insgesamt 59 Tabellen und 2 Schema-Arten (abc.* und efg.*).
Mein Problem ist es, wenn ich diese Abfrage ausführe, bekomme ich 65 Tabellen angezeigt, wo 2 Tabellen abc.youtube und efg.youtube jeweils 4 mal angezeigt werden. Eigentlich sollten diese beiden Tabellen jeweils einmal angezeigt werden. Die Tabellen haben den gleichen Tabellennamen "youtube", aber einen ungleichen Schemanamen abc.* und efg.*.
Wie kann ich dieses verhindern?
Hat jemand einen Vorschlag?
Freu mich auf Antworten und bedanke mich im Voraus.
Gruss
Deichhaus
ich stehe gerade vor einem Problem und weiss nicht weiter. Unszwar habe ich ein SQL-Programm geschrieben, was den Speicher aller Tabellen in einer Datenbank ermitteln soll.
Eine Tabelle soll in der DB angelegt werden, die folgende Spalten haben soll (diese habe ich gemacht):
- DB_name
- Schema_name,
- Table_name,
- Row_Count (Anzahl Datensätze),
- Column_Quantitiy (Anzahl Spalten),
- Data_Space_used
- Index_Space_used,
- Unused_Space_used
- Date (Wann zuletzt die Abfrage gemacht wurde)
Dann habe ich für die Ermittlung der Tabellenspeicher folgendes Programm geschrieben.
Code:
USE muster DECLARE @DB_name varchar(50) --DB_name = 'muster' DECLARE @cmdstr varchar(100) DECLARE @Sort bit SELECT @Sort = 0 /*Erstellen einer Hilfstabelle für Schema #TempSchema*/ CREATE TABLE #TempSchema ( TABLE_CATALOG varchar(50), TABLE_SCHEMA varchar (50), TABLE_NAME VARCHAR(50), TABLE_TYPE varchar (10) ) /*Fuellen von Hilfstabelle #TempSchema */ INSERT INTO #TempSchema ( TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE ) SELECT * FROM INFORMATION_SCHEMA.TABLES /*Erstellen einer Hilfstabelle für Schema #TempTable*/ CREATE TABLE #TempTable ( [Table_Name] varchar(50), Row_Count int, Table_Size varchar(50), Data_Space_Used varchar(50), Index_Space_Used varchar(50), Unused_Space varchar(50) ) /*Fuellen der Abfrage in Hilfstabelle #TempTable*/ SELECT @cmdstr = 'sp_msforeachtable ''sp_spaceused "?"''' INSERT INTO #TempTable EXEC(@cmdstr) /* Erstellen von Hilfstabelle #Spaltenanzahl*/ CREATE TABLE #Spaltenanzahl ( Table_Name varchar(128), Schema_id integer, Column_Quantity int ) /* Fuellen der Hilfstabelle #Spaltenanzahl */ INSERT INTO #Spaltenanzahl ( Table_Name, Schema_id, Column_Quantity ) SELECT Obj.Name, Obj.schema_id, max (col.Column_ID) As Spaltenanzahl FROM sys.All_Objects Obj JOIN Sys.All_Columns AS Col ON Col.Object_ID = Obj.Object_ID WHERE Obj.Type ='U' AND Obj.schema_id = 5 OR Obj.schema_id = 6 GROUP BY Obj.Name, obj.schema_id ORDER BY Obj.Name /*Entfernen der 'KB' in den einzelnen Spalten */ IF @Sort = 0 BEGIN UPDATE #TempTable SET Table_Size = REPLACE(Table_Size,'KB',' '), Data_Space_Used = REPLACE(Data_Space_Used,'KB',' '), Index_Space_Used = REPLACE(Index_Space_Used,'KB',' '), Unused_Space = REPLACE(Unused_Space,'KB',' ') /*Fuellen der Ziel_Tabelle mit Informationen */ INSERT INTO efg.sizes ( DB_name, Schema_name, Table_Name, Row_Count, Column_Quantity, Table_Size, Data_Space_Used, Index_Space_Used, Unused_Space, Date ) SELECT @DB_name, a.TABLE_SCHEMA, b.Table_Name, b.Row_Count, c.Column_Quantity, CAST (b.Table_Size AS Integer), CAST (b.Data_Space_Used AS Integer), CAST (b.Index_Space_Used AS Integer), CAST (b.Unused_Space AS Integer), GETDATE() FROM #TempTable AS b INNER JOIN #TempSchema AS a ON b.Table_Name = a.TABLE_NAME INNER JOIN #Spaltenanzahl AS c ON b.Table_Name = c.Table_Name AND b.Table_Name = c.Table_Name GROUP BY a.TABLE_SCHEMA, b.Table_Name, b.Row_Count, c.Column_Quantity, b.Table_Size, b.Data_Space_Used, b.Index_Space_Used , b.Unused_Space SELECT * FROM efg.sizes ORDER BY DB_name, Schema_name, Table_Name, Table_Size DESC END ELSE BEGIN SELECT * FROM #TempTable ORDER BY Table_Size DESC SELECT * FROM #TempSchema ORDER BY TABLE_NAME SELECT * FROM #Spaltenanzahl ORDER BY Column_Quantity END /*Loeschen der Hilfstabelle #TempTable */ DROP TABLE #TempTable /*Loeschen der Hilfstabelle #TempSchema */ DROP TABLE #TempSchema /*Loeschen der Hilfstabelle #Spaltenanzahl */ DROP TABLE #Spaltenanzahl /*Loeschen der Hilfstabelle #SchemaTable */ DROP TABLE #SchemaTable
Mein Problem ist es, wenn ich diese Abfrage ausführe, bekomme ich 65 Tabellen angezeigt, wo 2 Tabellen abc.youtube und efg.youtube jeweils 4 mal angezeigt werden. Eigentlich sollten diese beiden Tabellen jeweils einmal angezeigt werden. Die Tabellen haben den gleichen Tabellennamen "youtube", aber einen ungleichen Schemanamen abc.* und efg.*.
Wie kann ich dieses verhindern?
Hat jemand einen Vorschlag?
Freu mich auf Antworten und bedanke mich im Voraus.
Gruss
Deichhaus
Comment