Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Alle Nullable-Spalten in einer SQL Server-Datenbank auflisten

Nullable-Spalten in einer Datenbank können manchmal zu Leistungsproblemen führen. Das soll definitiv nicht heißen, dass Nullable-Spalten immer Leistungsprobleme verursachen, aber wenn Sie Leistungsprobleme haben, kann die Identifizierung von Nullable-Spalten möglicherweise einige Hinweise darauf geben, wo das Problem liegt. Manchmal wird eine Spalte NOT NULL kann helfen, die Leistung zu verbessern.

Mit „Nullable-Spalten“ meine ich Spalten, die NULL zulassen. Wenn die Definition der Spalte NOT NULL nicht enthält , dann lässt es NULL-Werte zu und ist „nullable“.

Unten ist Code, mit dem Sie alle Nullable-Spalten in einer Datenbank in SQL Server auflisten können.

Beispiel 1 – INFORMATION_SCHEMA.COLUMNS

Diese Ansicht des Informationsschemas listet alle Spalten auf, auf die der aktuelle Benutzer in der aktuellen Datenbank zugreifen kann. Es hat eine Spalte namens IS_NULLABLE . Wenn die relevante Spalte NULL zulässt, gibt diese Spalte YES zurück . Andernfalls NEIN zurückgegeben wird.

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE IS_NULLABLE = 'YES';

Dies listet alle Spalten aus der Ansicht auf.

Beispiel 2 – INFORMATION_SCHEMA.COLUMNS mit weniger angegebenen Spalten

Möglicherweise möchten Sie nicht, dass alle Spalten aus der Ansicht zurückgegeben werden. Hier ist ein Beispiel mit weniger zurückgegebenen Spalten.

SELECT
    TABLE_SCHEMA,
    TABLE_NAME,
    COLUMN_NAME,
    COLUMN_DEFAULT,
    DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE IS_NULLABLE = 'YES'
ORDER BY TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME;

Beispiel 3 – Verwendung von sys.columns

Wenn Sie die INFORMATION_SCHEMA.COLUMNS nicht verwenden möchten view, dann könnten Sie die sys.columns abfragen stattdessen ansehen.

Sie müssen jedoch einige Verknüpfungen vornehmen, wenn Sie die Tabellen und/oder das Schema usw. zurückgeben möchten.

Beispiel:

SELECT 
    SCHEMA_NAME(t.schema_id) AS [Schema],
    t.name AS [Table],
    c.name AS [Column],
    dc.definition AS [Column Default],
    ty.name AS [Data Type]
FROM sys.tables AS t
INNER JOIN sys.columns AS c 
    ON t.object_id = c.object_id
LEFT JOIN sys.types AS ty 
    ON c.user_type_id = ty.user_type_id
LEFT JOIN sys.default_constraints dc  
    ON c.default_object_id = dc.object_id
WHERE c.is_nullable = 1
ORDER BY [Schema], [Table], [Column];