2016-05-12 9 views
4

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

Antwort

3

Haben Sie versucht:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
+0

Nun, vielen Dank! Es scheint jetzt offensichtlich, aber ich habe nie realisiert, dass die Tabelle die genaue Länge enthielt, die ich brauchte. – Renato

+1

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. –