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
相关产品推荐
相关产品推荐

