12 June 2015

getting list of tables and fields in each in a database / sys_IsNullTable_sp

SELECT 
  C.TABLE_NAME, C.COLUMN_NAME, C.DATA_TYPE, 
  CASE 
   WHEN C.CHARACTER_MAXIMUM_LENGTH IS NOT NULL THEN 'STRINGA'
   WHEN C.NUMERIC_PRECISION IS NOT NULL THEN 'NUMERO'
   WHEN C.DATETIME_PRECISION IS NOT NULL THEN 'DATA'
  END
FROM INFORMATION_SCHEMA.COLUMNS C
WHERE C.IS_NULLABLE = 'YES'
 AND C.DATA_TYPE NOT LIKE '%bit%'
 AND C.DATA_TYPE NOT LIKE '%timestamp%'
 --AND C.TABLE_NAME = 'dev_web_Ordini_tb'

ORDER BY C.DATA_TYPE




ALTER PROCEDURE sys_IsNullTable_sp
   @tabName AS nvarchar(500)
 , @testMode AS bit = 0
AS
BEGIN
 -- 2015-06-12 - CREATE PROCEDURE
 
 /**************************************************************************
  IMPOSTA I CAMPI NULLI CON VALORI DI DEFAULT:
  '' SE E' UN TESTO
  0  SE E' UN NUMERO 
 **************************************************************************/
 
 -- per ora non gestisco i tipi date (che default uso??)
 -- nel caso, basta REMmare e SREMmare il codice!
 
 SET NOCOUNT ON
 
 DECLARE @sq as nvarchar(MAX) = ''

 SET @tabName = QUOTENAME(@tabName)

 DECLARE #cur CURSOR FOR
 --SELECT N'UPDATE ' + @tabName + ' SET ' + c.name + ' = ' 
 --   + CASE WHEN t.name LIKE '%char' THEN ''''''
 --     --WHEN t.name LIKE '%date%' THEN 'x'
 --     ELSE '0'
 --    END +  
 --   ' WHERE ' + c.name + ' IS NULL'
 --FROM sys.columns c
 --  INNER JOIN sys.types t
 --   ON c.user_type_id = t.user_type_id
 --WHERE OBJECT_ID = OBJECT_ID(@tabName)
 -- AND c.is_nullable = 1
 -- AND t.name NOT LIKE '%date%'

 SELECT N'UPDATE ' + @tabName + ' SET ' + c.COLUMN_NAME + ' = ' 
     + CASE 
       WHEN C.CHARACTER_MAXIMUM_LENGTH IS NOT NULL THEN '''''' -- 'STRINGA'
       WHEN C.NUMERIC_PRECISION IS NOT NULL THEN '0' -- 'NUMERO'
       --WHEN C.DATETIME_PRECISION IS NOT NULL THEN 'DATA'
      END

     + ' WHERE ' + c.COLUMN_NAME + ' IS NULL'
 FROM INFORMATION_SCHEMA.COLUMNS C
 WHERE C.IS_NULLABLE = 'YES'
  AND C.DATA_TYPE NOT LIKE '%bit%'
  AND C.DATA_TYPE NOT LIKE '%timestamp%'
  AND C.DATETIME_PRECISION IS NULL -- esclude le date
  AND QUOTENAME(C.TABLE_NAME) = @tabName



 OPEN #cur
 FETCH NEXT FROM #cur INTO @sq

 WHILE @@FETCH_STATUS = 0
  BEGIN
   IF @testMode = 0
    EXEC sp_executesql @sq
   ELSE
    PRINT @sq
    
   FETCH NEXT FROM #cur INTO @sq
  END

 CLOSE #cur
 DEALLOCATE #cur

END
GO


http://stackoverflow.com/questions/420741/getting-list-of-tables-and-fields-in-each-in-a-database