在SQL Server中使用sql_variant而不是varchar有什么好处吗?

m-y*_*m-y 14 c# performance varchar sql-variant sql-server-2012

我目前有一个数据库表设置如下(EAV - 业务原因是有效的):

  • Id - int(PK)
  • 钥匙 - 独特,varchar(15)
  • 价值 - varchar(1000)

这允许我将混合值作为键/值对添加到我的数据库中.例如:

1   | 'Some Text'      | 'Hello World'
2   | 'Some Number'    | '123456'
etc.
Run Code Online (Sandbox Code Playgroud)

在我的C#代码,我用ADO.Net使用reader.GetString(2);检索值作为一个字符串,然后让我的代码的其他地方将其转换为所需,例如... Int32.ParseInt(myObj.Value);.我正在考虑通过将value列更改为sql_variant数据类型来增强我的表,但我不知道这会带来什么好处?基本上,它有什么优势将我的价值列是sql_variantVS varchar(1000)


为了更清楚,我在某处读到sql_variant以nvarchar(4000)的形式返回给调用的客户端(ouch)!但是,在返回它之前,我不能把它转换成它的类型吗?显然,我的代码必须进行调整,以将值存储为对象而不是字符串值.我想,sql_variant在我目前的情况下使用与其他类型相比有哪些优点/缺点?哦,值得一提的是我计划存储的所有内容都是值列中的日期时间,字符串和数字类型(int,decimal等); 我不计划存储和blob或图像等.

Ste*_*eri 9

sql变量的好处是你可以在列中存储多个类型,并保留类型信息.

插入MySettings值('Name','MyName'); 插入MySettings值('ShouesNumber',45); 插入MySettings值('MyDouble',31.32);

如果要检索类型:

select SQL_VARIANT_PROPERTY ( value , 'BaseType' ) as DataType,* from mysettings
Run Code Online (Sandbox Code Playgroud)

你有:

Datatype Name          Value
-----------------------------
varchar  Name          MyName
int      ShoesNumber   45
numeric  MyDouble      31.32
Run Code Online (Sandbox Code Playgroud)

不幸的是,这有几个缺点:

  1. 不是很快
  2. ORM框架没有很好的支持


Sim*_*ier 8

如果将类型更改为sql_variant,则必须使用IDataRecord.GetValue方法.它将一直保留类型.

所以在.NET中它允许你拥有这种代码:

// read an object of SQL underlying data type 'int' stored in an sql_variant column
object o = myReader.GetValue(); // o.GetType() will be System.Int32

// read an object of SQL underlying data type '(n)varchar' or '(n)char' stored in an sql_variant column
object o = myReader.GetValue(); // o.GetType() will be System.String

// read an object of SQL underlying data type 'datetime' stored in an sql_variant column
object o = myReader.GetValue(); // o.GetType() will be System.DateTime

etc...
Run Code Online (Sandbox Code Playgroud)

当然,它假设您在保存时也这样做.只需将SqlParameter.Value设置为opaque值,不要使用DbType.

具有各种(标准)类型作为价值的EAV是我个人认为sql_variant有趣的一个案例.

当然"以SQLServer为中心的人"(阅读:DBA)根本不喜欢它:-)在SQL Server方面,sql_variant使用起来不太实际(如评论中所述),但如果你把它保留为不透明的"东西",不必在SQL过程代码中使用它,我认为没关系.因此,它在.NET/OO编程方面更具优势.