Mittwoch, 20. April 2022

SQL: Alle Tabellen, Felder, Datentypen + 0 ja/nein

Will man sich einen Überblick darüber verschaffen, wie eine Datenbank aufgebaut ist, ist es unter Zuhilfenahme von sysobjects und syscolums ganz gut möglich. Auch die Länge der Felder ist auswertbar. 

Ich habe allerdings ein bisschen Lebenszeit verbraucht, um das Problem der Maximallänge bei Feldern des Datentyps nvarchar zu begreifen.

Problem: Die Länge des Feldes steht normalerweise in syscolumns im Wert length. Allerdings ist der Wert  bei nvarchar nicht korrekt. Um genaz genau zu sein, ist der doppelt zu groß.


Ursache: Zitat: 

... a column that is declared to be varchar(10) will show 10 in that column.  A column that is nvarchar(10) will show 20 in that column since each nvarchar character takes 2 bytes.  If the value of the max_length is -1 then the column  was declared as varchar(max), nvarchar(max), or varbinary(max).

Quelle: Tom via msdn


Lösung:

OK, das Problem mit "(max)" und dem darauf folgendem "-1" und ist mir nicht so wichtig, aber die maximale Länge von begrenzten Textfeldern schon. 

Also sieht meine Abfrage so aus:

select 
	Tabellenname = dbo.sysobjects.name
	, Spaltenname = dbo.syscolumns.name
	, Datentyp = sys.types.name
	, Laenge = 
		case when sys.types.name = 'nvarchar' then dbo.syscolumns.length / 2
		else dbo.syscolumns.length 
		end
	, Null_OK = dbo.syscolumns.isnullable
from dbo.syscolumns 
	inner join  dbo.sysobjects on dbo.syscolumns.id = dbo.sysobjects.id
	left Join sys.types on user_type_id = dbo.syscolumns.xusertype
where (dbo.sysobjects.xtype = 'U') 
order by Tabellenname , Spaltenname

Es könnte jetzt natürlich noch eleganter sein, da ja die Werte bei beispielsweise bit und datetime was völlig anderes meinen, aber in meiner Welt sind "bit" und "datetime" hinreichend eindeutig für eine Schnittstellen-Konzeption.


Farbe ist das neue Schwarz

Das gute alte Batch - sie funktioniert und tut, aber leider ist sie so schwarz und unschön. Dabei gibt es von (nahezu) Anfang an die Möglich...