【问题标题】:SET datatype set in SQL ServerSQL Server 中设置的 SET 数据类型
【发布时间】:2012-10-25 06:31:55
【问题描述】:

在创建表时,我必须使用数据类型 SET,但 SQL Server 中似乎没有数据类型 SET。我正在查看 Microsoft 的网站,这些是它支持的数据类型: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 中。

【问题讨论】:

  • 您想用 SET 做什么?如果您回答我们可能会提出另一种方式来做您想做的事情...
  • 啊,这里是定义:dev.mysql.com/doc/refman/5.0/en/set.html.
  • 我已经编辑了我的帖子。是的,确切地说,这就是 SET 的定义。但我想这是针对 MySQL 的。对于 MS SQL,我找不到类似的东西。
  • 您使用的是什么版本的 SQL Server?
  • 当我尝试在该表中插入某些内容时,我只能选择其中一个。有一个问题问我,但它现在消失了(可能它被删除了)。版本是 2008 年。

标签: sql sql-server


【解决方案1】:

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

如果您使用按位运算符,您只会得到一列 创建表语句应如下所示:

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,
)

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

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

【讨论】:

  • 我编辑了我的帖子并写了一些关于如何将值打包到 int 以及如何选择它们的建议。如果您在选择它们后将值放入代码中的 .NET 枚举中,则不需要位掩码,您只需将 db int 值转换为枚举类型。
【解决方案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)引用它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 2015-06-25
    • 2010-12-04
    相关资源
    最近更新 更多