Ich habe folgendes Skript geschrieben, einige Daten in den Spalten einer bestimmten Tabelle zu erhalten:Alternative zu sys.columns.max_length
DECLARE @QueryTable varchar(35);
SET @QueryTable = 'Test';
SELECT DISTINCT
sys.columns.name AS 'Column',
sys.types.name AS 'Data type',
CASE WHEN sys.types.name IN ('varchar', 'char') THEN CAST(sys.columns.max_length AS varchar(5))
WHEN sys.types.name IN ('decimal', 'numeric') THEN CAST(CAST (sys.columns.precision AS nvarchar(10)) + ', ' + CAST(sys.columns.scale AS nvarchar(10)) AS nvarchar(10))
WHEN sys.types.name IN ('nvarchar', 'nchar') THEN CAST(sys.columns.max_length/2 AS varchar(5))
ELSE '-' END AS 'Max size',
CASE WHEN sys.columns.is_nullable = 1 THEN 'YES'
WHEN sys.columns.is_nullable = 0 THEN 'NO' END AS 'Allow nulls',
CASE WHEN sys.columns.name IN (SELECT Col.COLUMN_NAME from
INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab,
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col
WHERE
Col.Constraint_Name = Tab.CONSTRAINT_NAME
AND Col.Table_Name = Tab.TABLE_NAME
AND Constraint_Type = 'PRIMARY KEY'
AND Col.Table_Name = @QueryTable) THEN 'PK'
ELSE '' END AS 'Primary Key'
FROM
sys.columns, sys.types, sys.tables
WHERE
sys.tables.object_id = sys.columns.object_id AND
sys.types.system_type_id = sys.columns.system_type_id AND
sys.types.user_type_id = sys.columns.user_type_id AND
sys.tables.name = @QueryTable
ORDER BY sys.columns.name
natürlich für nvarchar und Nchar Typen bekomme ich eine max_length Das ist doppelt so groß wie die tatsächliche maximale Zeichenlänge für dieses Feld. Meine Frage ist, gibt es irgendwo, wo ich direkt die tatsächliche maximale Zeichenlänge erhalten konnte, die beim Erstellen der Spalte definiert wurde, ohne auf diese indirekte Berechnung zurückzugreifen?
Der Ansatz, den ich für die Ausgabe von Daten für numerische/Dezimal-Typen verwendet habe, ist meiner Meinung nach auch eine Art Chaos.
Danke
Nun, vielen Dank! Es scheint jetzt offensichtlich, aber ich habe nie realisiert, dass die Tabelle die genaue Länge enthielt, die ich brauchte. – Renato
Hinweis: INFORMATION_SCHEMA.COLUMNS ist eine Systemansicht (keine Tabelle als solche) und msdn.microsoft.com/en-us/library/ms186778.aspx sagt, dass INFORMATION_SCHEMA ein ISO-Standard ist, was Sicherheit vor der Vernachlässigung nahe legt, jedoch unter https://msdn.microsoft.com/en-us/library/ms186224.aspx wir sehen: ** Wichtig ** Verwenden Sie keine INFORMATION_SCHEMA Ansichten, um das Schema eines Objekts zu bestimmen. Die einzige zuverlässige Möglichkeit, das Schema eines Objekts zu finden, besteht darin, die sys.objects-Katalogsicht abzufragen. INFORMATION_SCHEMA-Ansichten können unvollständig sein, da sie nicht für alle neuen Features aktualisiert werden. –