You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 01:09:27