【问题标题】:Data entry lookup in SQL Server Management StudioSQL Server Management Studio 中的数据条目查找
【发布时间】:2013-07-13 22:07:32
【问题描述】:

Microsoft Access 允许我将字段输入值限制为某些预先确定的值,例如“Apple”、“Orange”、“Tomato”,甚至是像12 这样的整数215

基本上,它将表格单元格从 TextBox 转换为 ComboBox,并允许用户从 ComboBox 中选择有效值。

如何在 SQL Server Management Studio (2008 R2 Express) 中执行此操作?我通过单击表格并单击“编辑前 200 行”来输入数据。

谢谢。

更新:

到目前为止对我来说最简单的检查:

在对象资源管理器中,展开表格,右键单击“约束”,单击“新建约束...”,根据需要重命名约束,输入表达式:

([name]='Orange' OR [name]='Apple' OR [name]='Tomato')

其中“name”是列的名称,“Orange”、“Apple”和“Tomato”是有效值。我认为你必须使用单引号。

单击“关闭”,文件 |全部保存

如果与新约束有任何冲突,您必须先解决它们,然后才能保存。

现在,我想要一个组合框! ;)

输入错误数据并使其检查失败的一个令人讨厌的结果是,主键无论如何都会递增,并且您的数字存在差距。

【问题讨论】:

  • 据我所知,你不能。如果要将列中的数据限制为一组值,可以对具有这些值的表使用外键约束。
  • 是的,这就是我的意思,一列应该只包含某些值。所以我需要将所有这些值设置为另一个表中的主键并建立关系? Access 允许我在列属性中输入它们,而无需创建额外的表。这会提供一个组合框吗?
  • 好的,我想我测试了一下,当我尝试输入一个未在另一个表中定义的值时,它会抛出一个错误,我必须更正它。但是获得一个漂亮的查找组合框来从中选择值并不高兴。
  • 你不会得到一个组合框。 SSMS 不是 Access,不应用作数据输入应用程序。
  • 我明白了。那么这就回答了我的问题。

标签: sql-server database sql-server-2008 ssms


【解决方案1】:

您可以在 SQL Server 中使用check 约束来做到这一点:

alter table t
    add constraint CHK_column_values check (column in ('value1', 'value2'));

如果您尝试分配一个值,而表达式 column in ('value1', 'value2') 的计算结果不为 true,则 insert/update 将失败。

表达式不能包含对其他表的引用。但是,它可以包含一个用户定义的函数,该函数可以反过来检查另一个表。

编辑:

我最初在上面的表达式中留下了check。表格和值的形式:

alter table <your table name here>
    add constraint CHK_column_values check ([name] in ('Apple', 'Orange', 'Tomato'));

这就是 SSMS 工作室在您使用菜单选项时所做的事情。

【讨论】:

  • 嗯,我是 SQL 新手。 column in ('value1', 'value2') 到底是什么?我把这个脚本放在哪里?谢谢。
  • 是否可以有一个具有有效值的组合框?
  • @coding4fun 。 . .这是在数据库中完成的 SQL 解决方案。毫无疑问,还有一种方法可以在组合框中进行检查,但这与您在问题上放置的 SQL 标记无关。
  • 我无法在 Management Studio 中使用此语法。它说语法不正确。我将tcolumn 更改为我的表名和列名。
【解决方案2】:

表定义中的检查约束将限制允许的值。 http://msdn.microsoft.com/en-us/library/ms190377.aspx

IF OBJECT_ID('tempdb..#temp','U') IS NOT NULL DROP TABLE #temp;

CREATE TABLE #temp
(
    id int NOT NULL IDENTITY PRIMARY KEY
    ,name VARCHAR(50)
    CONSTRAINT CHK_name
    CHECK (name = 'Orange' OR name = 'Apple' OR name = 'Tomato')
)

INSERT INTO #temp(name)
VALUES
('Orange')
,('Pink')


Select  *
From    #temp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-18
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多