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.