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

SQL Server中批量INSERT多值与多次单条INSERT对sql_variant列类型属性获取的差异问询

SQL Server中批量INSERT多值与多次单条INSERT对sql_variant列类型属性获取的差异问询

最近我在SQL Server上测试sql_variant数据类型和SQL_VARIANT_PROPERTY函数(用来从sql_variant列中恢复数据信息)时,意外发现了一个出乎意料的行为:使用单条多值INSERT INTO语句插入数据,和使用多条单值INSERT INTO语句插入相同数据,后续通过SQL_VARIANT_PROPERTY获取的类型属性结果截然不同。

测试脚本

下面是复现这个行为的脚本:

BEGIN
    DECLARE @TblVariant AS TABLE (
        rowid int identity
        ,VariantValue sql_variant
        ,AsStringColumn varchar(max)
        ,AsStringTypeInfo varchar(max)
        ,AsStringValue varchar(max)
        ,Result varchar(max)
    )

    -- 场景1:单条INSERT语句插入多值
    INSERT INTO @TblVariant (VariantValue)
    VALUES 
        (convert(float        ,10.25))
        ,(convert(int          ,11.00))
        ,(convert(numeric(10,0),12.15))
        ,(convert(numeric(10,2),13.50))
        ,(convert(bigint       ,14.75))
        ,(null)

    UPDATE @TblVariant
    SET AsStringColumn = convert(varchar(max),VariantValue)
        ,AsStringTypeInfo =
            'BaseType='  +isnull(try_convert(varchar(max),SQL_VARIANT_PROPERTY(VariantValue,'BaseType')),'NULL')
            +';Precision=' +isnull(try_convert(varchar(max),SQL_VARIANT_PROPERTY(VariantValue,'Precision')),'NULL')
            +';Scale='     +isnull(try_convert(varchar(max),SQL_VARIANT_PROPERTY(VariantValue,'Scale')),'NULL')
            +';TotalBytes='+isnull(try_convert(varchar(max),SQL_VARIANT_PROPERTY(VariantValue,'TotalBytes')),'NULL')
            +';Collation=' +isnull(try_convert(varchar(max),SQL_VARIANT_PROPERTY(VariantValue,'Collation')),'NULL')
            +';MaxLength=' +isnull(try_convert(varchar(max),SQL_VARIANT_PROPERTY(VariantValue,'MaxLength')),'NULL')

    SELECT * FROM @TblVariant
    DELETE @TblVariant

    -- 场景2:多条单值INSERT语句
    INSERT INTO @TblVariant (VariantValue) VALUES (convert(float, 10.25))
    INSERT INTO @TblVariant (VariantValue) VALUES (convert(int, 11.00))
    INSERT INTO @TblVariant (VariantValue) VALUES (convert(numeric(10, 0), 12.15))
    INSERT INTO @TblVariant (VariantValue) VALUES (convert(numeric(10, 2), 13.50))
    INSERT INTO @TblVariant (VariantValue) VALUES (convert(bigint, 14.75))
    INSERT INTO @TblVariant (VariantValue) VALUES (NULL)

    UPDATE @TblVariant
    SET AsStringColumn = convert(varchar(max),VariantValue)
        ,AsStringTypeInfo =
            'BaseType='  +isnull(try_convert(varchar(max),SQL_VARIANT_PROPERTY(VariantValue,'BaseType')),'NULL')
            +';Precision=' +isnull(try_convert(varchar(max),SQL_VARIANT_PROPERTY(VariantValue,'Precision')),'NULL')
            +';Scale='     +isnull(try_convert(varchar(max),SQL_VARIANT_PROPERTY(VariantValue,'Scale')),'NULL')
            +';TotalBytes='+isnull(try_convert(varchar(max),SQL_VARIANT_PROPERTY(VariantValue,'TotalBytes')),'NULL')
            +';Collation=' +isnull(try_convert(varchar(max),SQL_VARIANT_PROPERTY(VariantValue,'Collation')),'NULL')
            +';MaxLength=' +isnull(try_convert(varchar(max),SQL_VARIANT_PROPERTY(VariantValue,'MaxLength')),'NULL')

    SELECT * FROM @TblVariant
END

观察到的现象

脚本中用表变量@TblVariant的sql_variant列VariantValue存储数据,然后通过SQL_VARIANT_PROPERTY获取该列的类型信息:

  • 场景1(单条多值INSERT):除了VariantValue为NULL的行,其他所有行的AsStringTypeInfo结果几乎完全相同;
  • 场景2(多条单值INSERT):每一行的AsStringTypeInfo都对应了插入时的原始数据类型,能准确反映存储值的真实类型属性。

而两种场景下,VariantValue和AsStringColumn中的值看起来完全一致。

我的疑问

为什么单条多值INSERT和多条单值INSERT这两种插入方式会存在这种差异?这种差异又是如何影响SQL_VARIANT_PROPERTY函数的行为的?

备注:内容来源于stack exchange,提问作者Mauricio Ortega

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:52:36