Mi base de datos está alojada en Microsoft SQL Server 2012 y necesito escribir una consulta T-SQL para extraer la longitud de cada columna de una tabla específica.

Suponiendo que mi base de datos se llama mydatabase y la tabla se llama table1 con 3 columnas (a saber, col1, col2 y col3), ¿cómo escribo mi sql? consulta para obtener esa información?

Idealmente, quiero que la salida sea algo como esto:

ColumnName    Length
  col1          50
  col2          30
  col3          25        

Información adicional: tendré que ejecutar esta consulta en varias otras tablas donde no sé el número o los nombres de las columnas que contiene. Por lo tanto, la consulta debe mostrar los nombres de las columnas con su longitud de columna respectiva.

2
user3115933 16 ene. 2018 a las 15:13

3 respuestas

La mejor respuesta

Si está buscando una consulta que devuelva la longitud máxima permitida de una columna, puede verla desde la vista INFORMATION_SCHEMA.COLUMN

SELECT
    ORDINAL_POSITION,
    COLLATION_NAME,
    CHARACTER_MAXIMUM_LENGTH
    FROM INFORMATION_SCHEMA.COLUMNS
       WHERE TABLE_NAME = 'YourTableName'

O si está buscando la longitud máxima de los datos almacenados, cada columna use las funciones MAX () y LEN ()

SELECT MAX(LEN(Col1)) FROM YourTable
2
Jayasurya Satheesh 16 ene. 2018 a las 12:18

asumo por longitud que quiere decir, por ejemplo, que si es un varchar(50) tiene una longitud de 50. Si es un decimal(18,2), entonces quiere saber Escala {{ X2}}, Precisión 2. Esto debería ayudar:

SELECT c.[name] AS ColumnName, st.[name] AS DataType,
       CASE WHEN st.[name] IN ('varchar','nvarchar') THEN c.max_length END AS Max_Length,
       CASE WHEN st.[name] NOT IN ('varchar','nvarchar') THEN c.scale END AS Scale,
       CASE WHEN st.[name] NOT IN ('varchar','nvarchar') THEN c.[precision] END AS [Precision]
FROM sys.tables t
     JOIN sys.columns c ON t.object_id = c.object_id
     JOIN sys.systypes st ON c.system_type_id = st.xtype
WHERE t.[name] = 'YourTableName';
2
Larnu 16 ene. 2018 a las 12:19

Puede usar COL_LENGTH para obtener esto (se puede encontrar más información aquí)

Podrías escribir algo como lo siguiente:

Select COL_LENGTH ( 'table1' , 'Col1' )
Select COL_LENGTH ( 'table1' , 'Col2' ) 
Select COL_LENGTH ( 'table1' , 'Col3' ) 

EDITAR:

Con la información adicional proporcionada, creo que lo siguiente es lo que está buscando:

SELECT        
       t.name AS 'Table_Name'
      ,c.name  AS 'Column_Name'
      ,I.CHARACTER_MAXIMUM_LENGTH 
      ,I.DATA_TYPE
FROM  sys.columns c
JOIN  sys.tables  t   ON c.object_id = t.object_id
JOIN  INFORMATION_SCHEMA.COLUMNS I on I.COLUMN_NAME = c.name

Probablemente tendrá que agregar una cláusula where ya que actualmente está buscando todo en una base de datos.

Al unir las sys.columns y sys.tables con information_schema.columns Puede encontrar la longitud de las columnas / tablas sin necesidad de conocer el nombre.

2
marc_s 20 ene. 2018 a las 09:01