求助:将MySQL敏感数据过滤查询转换为SQL Server语句
将MySQL敏感数据过滤查询转换为SQL Server版本
基于information_schema.columns的转换方案(贴近原MySQL语句)
SQL Server同样支持information_schema.columns视图,只需调整几个关键字段和排除条件即可:
SELECT table_catalog AS 'Database', table_name AS 'Table', column_name AS 'Column', -- 如需带长度的完整类型(如varchar(50)),替换上面的data_type为以下语句 -- CONCAT(data_type, CASE WHEN character_maximum_length IS NOT NULL THEN '(' + CAST(character_maximum_length AS VARCHAR) + ')' ELSE '' END) AS 'Type' data_type AS 'Type' FROM information_schema.columns WHERE (column_name LIKE '%cnpj%' OR column_name LIKE '%cpf%' OR column_name LIKE '%nom%' OR column_name LIKE '%fon%' OR column_name LIKE '%tel%' OR column_name LIKE '%mail%' OR column_name LIKE '%end%' OR column_name LIKE '%cel%' OR column_name LIKE '%gen%' OR column_name LIKE '%sex%' OR column_name LIKE '%elet%' OR column_name LIKE '%doc%' OR column_name LIKE '%mae%' OR column_name LIKE '%nasc%') AND table_catalog NOT IN ('master', 'model', 'msdb', 'tempdb') -- 若要排除系统架构(如sys、information_schema)下的对象,添加此条件 -- AND table_schema NOT IN ('sys', 'information_schema')
关键转换说明
- 数据库名字段:MySQL的
table_schema对应SQL Server的table_catalog(SQL Server的table_schema指数据库内的架构,比如默认的dbo) - 字段类型:MySQL的
column_type对应SQL Server的data_type,如果需要包含长度/精度的完整类型定义,使用注释中的拼接语句 - 系统对象排除:SQL Server的核心系统数据库为
master、model、msdb、tempdb,若需进一步排除系统架构下的对象,添加table_schema的过滤条件
基于sys系列视图的高效方案
如果偏好使用SQL Server原生的系统视图(性能更优),可以通过关联多个sys视图实现:
SELECT db.name AS 'Database', t.name AS 'Table', c.name AS 'Column', ty.name AS 'Type' -- 如需带长度的完整类型,替换上面的ty.name为以下语句 -- CONCAT(ty.name, CASE WHEN c.max_length > 0 AND ty.name IN ('varchar', 'nvarchar', 'char', 'nchar') THEN '(' + CAST(CASE WHEN ty.name LIKE 'n%' THEN c.max_length/2 ELSE c.max_length END AS VARCHAR) + ')' ELSE '' END) AS 'Type' FROM sys.columns c JOIN sys.tables t ON c.object_id = t.object_id JOIN sys.schemas s ON t.schema_id = s.schema_id JOIN sys.databases db ON t.database_id = db.database_id JOIN sys.types ty ON c.system_type_id = ty.system_type_id AND c.user_type_id = ty.user_type_id WHERE (c.name LIKE '%cnpj%' OR c.name LIKE '%cpf%' OR c.name LIKE '%nom%' OR c.name LIKE '%fon%' OR c.name LIKE '%tel%' OR c.name LIKE '%mail%' OR c.name LIKE '%end%' OR c.name LIKE '%cel%' OR c.name LIKE '%gen%' OR c.name LIKE '%sex%' OR c.name LIKE '%elet%' OR c.name LIKE '%doc%' OR c.name LIKE '%mae%' OR c.name LIKE '%nasc%') AND db.name NOT IN ('master', 'model', 'msdb', 'tempdb') AND s.name NOT IN ('sys', 'information_schema')
此方案说明
- 通过
sys.columns关联sys.tables、sys.schemas、sys.databases获取完整的库、表、架构层级信息 sys.types用于准确映射字段类型,同时关联system_type_id和user_type_id兼容用户自定义类型
内容的提问来源于stack exchange,提问作者Thiago
相关产品推荐
相关产品推荐

