2015-09-09 61 views
3

有没有办法让这些值的CHECK约束SQL Server快速值CHECK

CONSTRAINT TheCollumn CHECK (TheCollumn IN('One','Two','Three')) 

我想从查询得到'One' 'Two' 'Three',我就可以用它来填充下拉而不必重新输入在下拉列表中

+0

它在服务器中以预先解析的形式存储,但是我知道用于提取约束信息的每个机制都会重新构造SQL。那么,你想把一个完整的SQL解析器放到你的系统中吗? –

+0

是的,我想从服务器中提取完整的SQL,因为我可能能够分析该数据并从中得出结果 –

回答

7

我想你想有一个外键约束和参照表中的值:

create table refTheColumn (
    name varchar(255) primary key 
); 

. . . 
    constraint fk_thecolumn foreign key (theColumn) references refTheColumn(name); 

然后,您可以使用参考表填充列表。

+0

我可以这样做,但我想实现的是一种'哈克'方法使用我的代码生成器来使用这些值并创建一个枚举类型,因为SQL Server没有枚举 –

+1

@DonaldJansen:枚举是适当的外键约束的糟糕替代品。 Gordon的建议*真的*是最好的方法 –

+0

目前我这样做 生成的代码将有该属性和部分代码将有一个Property_Enum来回转换的值 –

2

这是一个坏主意,但这里的一般方法:

USE tempdb 
CREATE TABLE #tmp (v varchar(50)); 
ALTER TABLE #tmp ADD CONSTRAINT TheCollumn CHECK(v IN ('One', 'Two', 'Three')); 
GO 


SELECT definition FROM sys.check_constraints WHERE Name = 'TheCollumn' 

将输出:

([v]='Three' OR [v]='Two' OR [v]='One') 

你不得不解析代码(但是在SQL语法分析这将是非常具有挑战性和不明智的)。正如Gordon Lindoff所说,外键绝对更简洁/更易于使用。

更多的原因,这是一个坏主意:

  • 如果检查约束被不同的定义,它可以存储不同的看法(因此Damien_The_Unbeliever的约需要一个SQL解析器点)。例如,它可能是AND子句,或者它可能指向一个函数(考虑[v] = right(SomeOtherColumn, 5),现在您必须解释它)
  • sys表(sys.check_constraints)可能会在将来的版本中更改并且不被视为可靠的方法访问这些数据。你的代码可能无法在SQL升级中生存(而使用参考表)。更糟糕的是,它可能不会在升级时抛出异常,从而改变SQL服务器功能的使用,但它可能会产生一个很难在整个环境中追踪或重现的错误(例如,产品升级但dev不支持)。
+0

不是一个好主意,但一个很好的答案:绝对一个聪明的方法。 –

+0

我明白Gordon Linoff可能是使用表格的最佳答案,但是我需要获得一种方式来指定表格用作C#中的Enum,而不是实际的对象,但是您在这里给出的是Exactly我的实验需要什么。我将接受戈登的答案(对于未来的读者),但我一定会玩这个代码 –

+1

如果你想填充一个组合框,我会认为'List '比“Enum '...如果你需要每个列表项的一个键,你的参考表可以有一个额外的列,并从中填入一个“字典”。 –