我应该使用SQL_Variant数据类型吗? [英] Should I use SQL_Variant data type?
问题描述
这是表DDL
CREATE TABLE CPSync4D.ProjectProfilerOption
/ pre>
(
ProjectProfilerOptionID INT IDENTITY(1,1)CONSTRAINT PK_ProjectProfilerOption_ProjectProfilerOptionID PRIMARY KEY
,ProjectID INT CONSTRAINT FK_ProjectProfilerOption_Project_ProjectID FOREIGN KEY(ProjectID)参考CPSync4D.Project(ProjectID)ON DELETE CASCADE
,ProfilerOptionID TINYINT CONSTRAINT FK_ProjectProfilerOption_ProfilerOption_ProfilerOptionID FOREIGN KEY(ProfilerOptionID)参考CPSync4D.ProfilerOption(ProfilerOptionID)
,ProfilerOptionValue sql_variant NOT NULL
)
Go
profileroptionvalue列可以包含一个字符串,最多可以包含30个字符,整数或十进制值,例如值为ProfilerValueType,或12.52或20等(不超过两个小数和整数值小于100)
我应该使用sql_variant还是varchar(30 )...?我从来没有使用过sql_variant,不知道在数据库设计方面没有使用任何含义。
使用sql_variant ...与.net代码的任何陷阱
解决方案
作为一般规则,您应该避免使用SQL Server的sql_variant
数据类型。除了记忆猪,sql_variant是有限的:
- 变体不能是主键或外键的一部分。
- 变体不能作为计算列的一部分。
- 在WHERE子句中,变量不能与LIKE一起使用。
- OLE DB和ODBC提供程序自动将变体转换为nvarchar(4000) - ouch!
为避免出现问题,请始终将sql_variant数据类型转换为
。使用任何方法,只是不要尝试使用
一个未转换的sql_variant数据类型。
我避风港' t使用
sql_variant
之前,但考虑到这些限制和性能影响,我会先看看替代方案。
关注将是我最不喜欢的解决方案
- 只需创建三个不同的列。 3不同的数据类型(应该)意味着在客户端和服务器端解释它们的3种不同的方法。
- 如果不是选项,请使用
VARCHAR
列,以便您至少使用LIKE
语句。 - 使用
sql_variant
数据类型。
修改 Cudo到ta.speot。是
唯一的主键或外键可能包括
sql_variant类型的列,但构成特定行的
键的数据值的总长度不应大于最大长度的
索引。这是900字节
using SQL Server 2005 with SP4 and I am designing a database table.
Here is the table DDL
CREATE TABLE CPSync4D.ProjectProfilerOption
(
ProjectProfilerOptionID INT IDENTITY(1,1) CONSTRAINT PK_ProjectProfilerOption_ProjectProfilerOptionID PRIMARY KEY
,ProjectID INT CONSTRAINT FK_ProjectProfilerOption_Project_ProjectID FOREIGN KEY(ProjectID) REFERENCES CPSync4D.Project(ProjectID) ON DELETE CASCADE
,ProfilerOptionID TINYINT CONSTRAINT FK_ProjectProfilerOption_ProfilerOption_ProfilerOptionID FOREIGN KEY(ProfilerOptionID) REFERENCES CPSync4D.ProfilerOption (ProfilerOptionID)
,ProfilerOptionValue sql_variant NOT NULL
)
Go
profileroptionvalue column can hold either a string upto 30 characters, integer or decimal values e.g. values are "ProfilerValueType", or 12.52 or 20 etc. (no more than than two decimals and integer values are less than 100)
Should I use sql_variant or varchar(30)...? I never used sql_variant before and not sure any implication of not using in terms of database design.
Any pitfalls of using sql_variant...with .net code
10 reasons to explicitly convert SQL Server data types
As a general rule, you should avoid using SQL Server’s sql_variant data type. Besides being a memory hog, sql_variant is limited:
- Variants can’t be part of a primary or foreign key. (this doesn't hold as of SQL Server 2005. See update below)
- Variants can’t be part of a computed column.
- Variants won’t work with LIKE in a WHERE clause.
- OLE DB and ODBC providers automatically convert variants to nvarchar(4000) — ouch!
To avoid problems, always explicitly convert sql_variant data types as you use them. Use any method you please, just don’t try to work with an unconverted sql_variant data type.
I haven't used sql_variant
before but with these restrictions and performance implications in mind, I would first look at alternatives.
Following would be my most to least prefered solution
- Simply create three different columns. 3 Different data types (should) mean 3 different ways of interpreting it both at the client side and server side.
- If that is not an option, use a
VARCHAR
column so you can at least useLIKE
statements. - Use the
sql_variant
data type.
Edit Cudo's to ta.speot.is
Variants can be part of a primary of foreign key
A unique, primary, or foreign key may include columns of type sql_variant, but the total length of the data values that make up the key of a specific row should not be more than the maximum length of an index. This is 900 bytes
这篇关于我应该使用SQL_Variant数据类型吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!