我应该使用SQL_Variant数据类型吗? [英] Should I use SQL_Variant data type?

查看:89
本文介绍了我应该使用SQL_Variant数据类型吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用SQL Server 2005与SP4,我正在设计一个数据库表。



这是表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)参考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
/ pre>

profileroptionvalue列可以包含一个字符串,最多可以包含30个字符,整数或十进制值,例如值为ProfilerValueType,或12.52或20等(不超过两个小数和整数值小于100)



我应该使用sql_variant还是varchar(30 )...?我从来没有使用过sql_variant,不知道在数据库设计方面没有使用任何含义。



使用sql_variant ...与.net代码的任何陷阱

解决方案

明确转换SQL Server数据类型的10个原因


作为一般规则,您应该避免使用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 use LIKE 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆