在SQL Server中设置的SET数据类型

时间:2012-11-05 12:08:49

标签: sql sql-server

创建表时我必须使用数据类型SET,但看起来SQL Server中没有数据类型SET。我正在微软的网站上查看它们支持的数据类型:http://msdn.microsoft.com/en-us/library/ms187752.aspx

我应该使用哪一个来替换SET

我在MySQL数据库中使用了SET,如下所示:

CREATE TABLE IF NOT EXISTS `configurations` (
`index` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`configDuration` int(5) NOT NULL,
`configDurationPerspective` set('list_this_day','list_remaining') NOT NULL,
PRIMARY KEY (`index`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1;

然后当我将数据插入表格时,它看起来像这样:

INSERT INTO 'configurations' (index, user_id, configDuration, configDurationPerspective) VALUES (1, 1, 2, 'list_this_day');

别介意引号。粘贴代码时搞砸了。

现在我想做同样的事情,但是在SQL Server中。

2 个答案:

答案 0 :(得分:2)

您必须使用单独的位字段(每个值具有位数据类型的一列),或者将值打包到具有整数数据类型的列中。如果您使用整数,则必须使用t-sql bitwise operators来读取和写入值。

如果使用按位运算符,则只能获得一列 create table语句应如下所示:

CREATE TABLE configurations(
[index] int NOT NULL IDENTITY (1,1) PRIMARY KEY,
user_id int NOT NULL,
configDuration int  NOT NULL,
configDurationPerspective int NOT NULL,
)

然后你必须将可能的位掩码值1,2,4,8,16,32插入configDurationPerspective

INSERT INTO 'configurations' (index, user_id, configDuration, configDurationPerspective) VALUES (1, 1, 2, 'list_this_day');

会转换为

INSERT INTO 'configurations' (index, user_id, configDuration, configDurationPerspective) VALUES (1, 1, 2, 1);

INSERT INTO 'configurations' (index, user_id, configDuration, configDurationPerspective) VALUES (1, 1, 2, 'list_remaining');

会转换为

INSERT INTO 'configurations' (index, user_id, configDuration, configDurationPerspective) VALUES (1, 1, 2, 2);

并选择看起来像:

select  [index], configDuration,
case when configDurationPerspective & 1 > 0 then 'list_this_day' else '' end
 + case when configDurationPerspective & 2 > 0 then 'list_remaining' else '' end as configDurationPerspective
 from configurations

答案 1 :(得分:2)

MS SQL Server中的基本类型列表不支持相同。但我们所拥有的是约束和用户类型。在这个问题中,你可以看到MySQL enum 是如何解决的

SQL Server equivalent to MySQL enum data type?

您还可以观察用户类型(我已经看到它们被用于类似用途)

http://msdn.microsoft.com/en-us/library/ms175007.aspx

但作为这个问题最典型的解决方案,我们(在我们的项目中)使用了一些" CodeList / StaticList"表并通过主键(int,shortint,tinyint)引用它