m-y*_*m-y 14 c# performance varchar sql-variant sql-server-2012
我目前有一个数据库表设置如下(EAV - 业务原因是有效的):
这允许我将混合值作为键/值对添加到我的数据库中.例如:
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或图像等.
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)
不幸的是,这有几个缺点:
如果将类型更改为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编程方面更具优势.