3

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

我应该用哪一个来代替SET

SET在 MySQL 数据库中使用过这样的:

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 中。

4

2 回答 2

2

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

如果您使用按位运算符,您只会得到一列 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
于 2012-11-05T12:31:24.107 回答
2

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

SQL Server 相当于 MySQL 枚举数据类型?

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

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

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

于 2012-11-05T13:15:37.383 回答