如何基于Lookup表验证指定表中目标列的Decimal与Integer类型?
验证指定表列是否为Decimal/Integer类型的解决方案
不用纠结while循环或游标,直接利用数据库的系统元数据视图就能批量验证列类型,下面针对常见数据库给出具体实现:
1. 核心思路
数据库系统会把表、列的元数据存在系统视图里(比如SQL Server的sys.columns/sys.types,MySQL的INFORMATION_SCHEMA.COLUMNS),只要把你的lkpTable和这些系统视图关联,就能直接查询列的类型并验证是否符合要求。
2. 具体实现示例
SQL Server 版本(2016+)
假设你的lkpTable结构是TableName NVARCHAR(128), ColumnNames NVARCHAR(MAX)(列名用逗号分隔),用STRING_SPLIT拆分列名后关联系统表:
SELECT l.TableName, col.value AS TargetColumn, t.name AS ActualType, CASE WHEN t.name IN ('int', 'bigint', 'smallint', 'tinyint', 'decimal', 'numeric') THEN '✅ 符合类型要求' ELSE '❌ 类型不符合' END AS ValidationResult FROM lkpTable l CROSS APPLY STRING_SPLIT(l.ColumnNames, ',') col JOIN sys.columns c ON c.object_id = OBJECT_ID(l.TableName) AND c.name = LTRIM(RTRIM(col.value)) -- 处理列名前后空格 JOIN sys.types t ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id -- 如果要指定单个表,加WHERE条件 WHERE l.TableName = @InputTableName;
如果是SQL Server 2016之前的版本,没有STRING_SPLIT,可以用自定义的字符串拆分函数替代。
MySQL 版本
利用INFORMATION_SCHEMA.COLUMNS和FIND_IN_SET匹配逗号分隔的列名:
SELECT l.TableName, c.COLUMN_NAME AS TargetColumn, c.DATA_TYPE AS ActualType, CASE WHEN c.DATA_TYPE IN ('int', 'bigint', 'smallint', 'tinyint', 'decimal', 'numeric') THEN '✅ 符合类型要求' ELSE '❌ 类型不符合' END AS ValidationResult FROM lkpTable l JOIN INFORMATION_SCHEMA.COLUMNS c ON c.TABLE_SCHEMA = DATABASE() -- 指定当前数据库,也可以写具体库名 AND c.TABLE_NAME = l.TableName AND FIND_IN_SET(c.COLUMN_NAME, l.ColumnNames) > 0 -- 指定单个表的话加WHERE WHERE l.TableName = @InputTableName;
3. 整合到你的存储过程
把上面的查询直接替换掉存储过程里原来的查询逻辑就行,不需要循环或游标。比如SQL Server的存储过程修改后:
CREATE PROCEDURE ValidateTargetColumns @InputTableName NVARCHAR(128) AS BEGIN SET NOCOUNT ON; -- 直接用元数据查询验证类型 SELECT l.TableName, col.value AS TargetColumn, t.name AS ActualType, CASE WHEN t.name IN ('int', 'bigint', 'smallint', 'tinyint', 'decimal', 'numeric') THEN 'Valid' ELSE 'Invalid' END AS IsValidType FROM lkpTable l CROSS APPLY STRING_SPLIT(l.ColumnNames, ',') col JOIN sys.columns c ON c.object_id = OBJECT_ID(l.TableName) AND c.name = LTRIM(RTRIM(col.value)) JOIN sys.types t ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id WHERE l.TableName = @InputTableName; END
4. 注意事项
- 确保
lkpTable里的列名和实际表的列名完全一致(包括大小写、空格、特殊字符,必要时用引号包裹,比如SQL Server的[]、MySQL的) - 如果是Oracle数据库,需要用
ALL_TAB_COLUMNS视图,整数和小数都属于NUMBER类型,要通过SCALE判断:SCALE = 0是整数,SCALE > 0是小数,调整CASE逻辑即可。
内容的提问来源于stack exchange,提问作者0537
相关产品推荐
相关产品推荐

