Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Elenca tutte le colonne nullable in un database di SQL Server

Le colonne nullable in un database a volte possono causare problemi di prestazioni. Questo non vuol dire assolutamente che le colonne nullable causeranno sempre problemi di prestazioni, ma se si verificano problemi di prestazioni, l'identificazione di colonne nullable può potenzialmente fornire alcuni indizi su dove si trova il problema. A volte creando una colonna NOT NULL può aiutare a migliorare le prestazioni.

Per "colonne nullable" intendo colonne che consentono NULL. Se la definizione della colonna non include NOT NULL , quindi consente valori NULL ed è "nullable".

Di seguito è riportato il codice che consente di elencare tutte le colonne nullable in un database in SQL Server.

Esempio 1 – INFORMATION_SCHEMA.COLUMNS

Questa visualizzazione dello schema di informazioni elenca tutte le colonne a cui l'utente corrente può accedere nel database corrente. Ha una colonna chiamata IS_NULLABLE . Se la colonna pertinente consente NULL, questa colonna restituisce YES . Altrimenti, NO viene restituito.

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

Questo elenca tutte le colonne dalla vista.

Esempio 2 – INFORMATION_SCHEMA.COLUMNS con meno colonne specificate

Potresti non voler restituire tutte le colonne dalla vista. Ecco un esempio con meno colonne restituite.

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;

Esempio 3:utilizzo di sys.columns

Se non desideri utilizzare INFORMATION_SCHEMA.COLUMNS view, puoi interrogare sys.columns visualizza invece.

Tuttavia, dovrai eseguire alcuni join se desideri restituire le tabelle e/o lo schema, ecc.

Esempio:

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];