domingo, 4 de diciembre de 2011

DICCIONARIO DE DATOS CON SQL SERVER

En internet hay varios ejemplos que abordan este tema sin embargo ninguno de ellos me ha terminado de gustar, de manera rapida escribo este script que hace el trabajo que 'por ahora' requiero. En otra oportunidad profundizaré mas en el tema. Para este ejemplo hago uso basicamente de: INFORMATION_SCHEMA.TABLES para obtener informacion de las tablas de la bd e INFORMATION_SCHEMA.COLUMNS para obtener informacion de cada columna por cada tabla. Sin mas preambulo aca el script:
SET NOCOUNT ON

DECLARE @NOMBRE_TABLA sysname
DECLARE @iColumna int,@iUltimaColumna int,
  @NombreColumna sysname,
  @TipoColumna sysname,
  @Longitud int

SELECT @NOMBRE_TABLA = MIN(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE= 'BASE TABLE' AND TABLE_NAME!= 'sysdiagrams'

WHILE @NOMBRE_TABLA IS NOT NULL
BEGIN
 PRINT '======================' + @NOMBRE_TABLA + ':========================='
 
 SELECT @iColumna = 0, @iUltimaColumna = max(ORDINAL_POSITION) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @NOMBRE_TABLA

 WHILE @iColumna < @iUltimaColumna
 BEGIN
  SELECT @iColumna = min(ORDINAL_POSITION) FROM INFORMATION_SCHEMA.COLUMNS
  WHERE TABLE_NAME = @NOMBRE_TABLA and ORDINAL_POSITION > @iColumna;
  --
  SELECT @NombreColumna = IC.COLUMN_NAME, @TipoColumna = IC.DATA_TYPE,  
  @Longitud = CASE WHEN CAST(IC.DATA_TYPE AS NVARCHAR) IN ('char','nchar','varchar','nvarchar','text','ntext') THEN IC.CHARACTER_MAXIMUM_LENGTH ELSE NULL END
  FROM INFORMATION_SCHEMA.COLUMNS IC
  WHERE IC.TABLE_NAME = @NOMBRE_TABLA and IC.ORDINAL_POSITION = @iColumna;
  PRINT '. '+ @NombreColumna +  ' ' + @TipoColumna + ' ' + ISNULL(CAST(@Longitud AS NVARCHAR(64)),'')
  --
 END
 
 SELECT @NOMBRE_TABLA= MIN(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME> @NOMBRE_TABLA
 AND TABLE_TYPE= 'BASE TABLE' AND TABLE_NAME!= 'sysdiagrams'
END