sql >> Base de Datos >  >> RDS >> Sqlserver

Listar todas las columnas anulables en una base de datos de SQL Server

Las columnas anulables en una base de datos a veces pueden provocar problemas de rendimiento. Eso definitivamente no quiere decir que las columnas anulables siempre causen problemas de rendimiento, pero si tiene problemas de rendimiento, la identificación de columnas anulables puede proporcionar algunas pistas sobre dónde radica el problema. A veces, hacer una columna NOT NULL puede ayudar a mejorar el rendimiento.

Por "columnas anulables" me refiero a columnas que permiten NULL. Si la definición de la columna no incluye NOT NULL , luego permite valores NULL y es "anulable".

A continuación se muestra el código que le permite enumerar todas las columnas anulables en una base de datos en SQL Server.

Ejemplo 1:INFORMACIÓN_ESQUEMA.COLUMNAS

Esta vista de esquema de información enumera todas las columnas a las que puede acceder el usuario actual en la base de datos actual. Tiene una columna llamada IS_NULLABLE . Si la columna relevante permite NULL, esta columna devuelve YES . De lo contrario, NO es devuelto.

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

Esto enumera todas las columnas de la vista.

Ejemplo 2:INFORMACIÓN_ESQUEMA.COLUMNAS con menos columnas especificadas

Es posible que no desee que se devuelvan todas las columnas de la vista. Aquí hay un ejemplo con menos columnas devueltas.

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;

Ejemplo 3:Uso de sys.columns

Si no desea utilizar el INFORMATION_SCHEMA.COLUMNS vista, entonces podría consultar el sys.columns ver en su lugar.

Sin embargo, deberá realizar algunas uniones si desea devolver las tablas y/o el esquema, etc.

Ejemplo:

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