我希望能夠遍歷數據庫中的所有表並找出每個表的數據類型和長度。如果數據類型是int,那麼我必須向該列插入0,如果列是String並且長度小於30,則插入'UKN'或者如果列是String並且超過30則插入爲'UnKnown'。遍歷數據庫中的所有表並根據SQL Server中的列數據類型插入一行
我該如何編寫一個循環遍歷所有表的腳本並根據條件插入數據庫? 對於特定的表格如何取每一列和相關的數據類型並檢查?
我希望能夠遍歷數據庫中的所有表並找出每個表的數據類型和長度。如果數據類型是int,那麼我必須向該列插入0,如果列是String並且長度小於30,則插入'UKN'或者如果列是String並且超過30則插入爲'UnKnown'。遍歷數據庫中的所有表並根據SQL Server中的列數據類型插入一行
我該如何編寫一個循環遍歷所有表的腳本並根據條件插入數據庫? 對於特定的表格如何取每一列和相關的數據類型並檢查?
使用系統表:
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'
您可以使用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
如何爲這些表列添加'OUTPUTFROM'值? – Pirinthan
請顯示想要插入的表看起來像 –
不知道你的表是什麼樣的,但我已經更新了答案,以顯示INSERT或UPDATE的可能選項 –