2017-10-17 15 views
-1

Je souhaite parcourir toutes les tables de ma base de données et connaître le type et la longueur de chaque table. Si le type de données est int, je dois insérer 0 dans cette colonne, Si la colonne est Chaîne et la longueur est inférieure à 30, insérez 'UKN' ou Si la colonne est Chaîne et râpe que 30, insérez comme 'Non connu'. Comment écrire un script qui parcourt toutes les tables et les insère dans une base de données en fonction de la condition? Pour la table particulière comment prendre toutes les colonnes et le type de données connexes et vérifier?Parcourez toutes les tables d'une base de données et insérez une ligne basée sur le type de données de la colonne dans SQL Server

Répondre

1

Utilisez les tables système:

select t.name as TableName 
     , c.name as ColumnName 
     , ty.name as [DataType] 
     , case when ty.name = 'int' then '0' 
       when ty.name in ('char', 'nchar', 'varchar', 'nvarchar') 
        then case when c.max_length <30 then 'UKN' 
           else 'UnKnown' end 
      end as OUTPUT 
from sys.tables t 
inner join sys.columns c on t.object_id = c.object_id 
inner join sys.types ty on ty.user_type_id = c.user_type_id 
where t.type = 'U' 
2

Vous pouvez utiliser information_schema.columns vue du système, pas besoin de pour redoutée CURSOR

USE <DATABASE_NAME> 
GO 

SELECT C.TABLE_CATALOG 
    , C.TABLE_SCHEMA 
    , C.TABLE_NAME 
    , C.COLUMN_NAME 
    , C.DATA_TYPE 
    , C.CHARACTER_MAXIMUM_LENGTH 
    , CASE 
     WHEN C.DATA_TYPE = 'int' THEN '0' 
     WHEN C.DATA_TYPE IN ('char', 'nchar', 'varchar', 'nvarchar') 
     THEN 
      CASE 
       WHEN C.CHARACTER_MAXIMUM_LENGTH <30 then 'UKN' 
       ELSE 'UnKnown' 
      END 
     END 'OUTPUTFROM' 
FROM 
    information_schema.columns C 
ORDER BY 
    TABLE_NAME 

Pour insérer

;WITH cteX 
AS(
    SELECT C.TABLE_CATALOG 
     , C.TABLE_SCHEMA 
     , C.TABLE_NAME 
     , C.COLUMN_NAME 
     , C.DATA_TYPE 
     , C.CHARACTER_MAXIMUM_LENGTH 
     , CASE 
      WHEN C.DATA_TYPE = 'int' THEN '0' 
      WHEN C.DATA_TYPE IN ('char', 'nchar', 'varchar', 'nvarchar') 
      THEN 
       CASE 
        WHEN C.CHARACTER_MAXIMUM_LENGTH <30 then 'UKN' 
        ELSE 'UnKnown' 
       END 
      END 'OUTPUTFROM' 
    FROM 
     information_schema.columns C 
) 
INSERT INTO dbo.TABLE 
    (database_name, table_schema, table_name, column_name, Output_from) 
SELECT 
    TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, OUTPUTFROM 
FROM 
    cteX X 

MIS À JOUR

;WITH cteX 
AS(
    SELECT C.TABLE_CATALOG 
     , C.TABLE_SCHEMA 
     , C.TABLE_NAME 
     , C.COLUMN_NAME 
     , C.DATA_TYPE 
     , C.CHARACTER_MAXIMUM_LENGTH 
     , CASE 
      WHEN C.DATA_TYPE = 'int' THEN '0' 
      WHEN C.DATA_TYPE IN ('char', 'nchar', 'varchar', 'nvarchar') 
      THEN 
       CASE 
        WHEN C.CHARACTER_MAXIMUM_LENGTH <30 then 'UKN' 
        ELSE 'UnKnown' 
       END 
      END 'OUTPUTFROM' 
    FROM 
     information_schema.columns C 
) 
UPDATE 
    T 
SET 
    T.OUTPUTFROM = X.OUTPUTFROM 
FROM 
    dbo.TABLE T 
INNER JOIN 
    cteX X ON X.TABLE_CATALOG = T.database_name 
      AND X.TABLE_SCHEMA = T.table_schema 
      AND X.table_name = T.table_name 
      AND X.column_name = T.column_name 
+0

Comment insérer les valeurs 'OUTPUTFROM' pour ces colonnes de tables? – Pirinthan

+0

S'il vous plaît montrer à quoi ressemble la table qui veut INSÉRER dans –

+0

Vous ne savez pas à quoi ressemble la table, mais j'ai mis à jour la réponse pour montrer les options possibles à INSERT ou UPDATE –