2017-10-17 74 views
-1

我希望能夠遍歷數據庫中的所有表並找出每個表的數據類型和長度。如果數據類型是int,那麼我必須向該列插入0,如果列是String並且長度小於30,則插入'UKN'或者如果列是String並且超過30則插入爲'UnKnown'。遍歷數據庫中的所有表並根據SQL Server中的列數據類型插入一行

我該如何編寫一個循環遍歷所有表的腳本並根據條件插入數據庫? 對於特定的表格如何取每一列和相關的數據類型並檢查?

回答

1

使用系統表:

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

您可以使用information_schema.columns系統視圖下,沒有必要對可怕的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 

要插入

;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 

與UPDATE

;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

如何爲這些表列添加'OUTPUTFROM'值? – Pirinthan

+0

請顯示想要插入的表看起來像 –

+0

不知道你的表是什麼樣的,但我已經更新了答案,以顯示INSERT或UPDATE的可能選項 –

相關問題