有没有办法让这些值的CHECK
约束SQL Server快速值CHECK
例
CONSTRAINT TheCollumn CHECK (TheCollumn IN('One','Two','Three'))
我想从查询得到'One' 'Two' 'Three'
,我就可以用它来填充下拉而不必重新输入在下拉列表中
有没有办法让这些值的CHECK
约束SQL Server快速值CHECK
例
CONSTRAINT TheCollumn CHECK (TheCollumn IN('One','Two','Three'))
我想从查询得到'One' 'Two' 'Three'
,我就可以用它来填充下拉而不必重新输入在下拉列表中
我想你想有一个外键约束和参照表中的值:
create table refTheColumn (
name varchar(255) primary key
);
. . .
constraint fk_thecolumn foreign key (theColumn) references refTheColumn(name);
然后,您可以使用参考表填充列表。
我可以这样做,但我想实现的是一种'哈克'方法使用我的代码生成器来使用这些值并创建一个枚举类型,因为SQL Server没有枚举 –
@DonaldJansen:枚举是适当的外键约束的糟糕替代品。 Gordon的建议*真的*是最好的方法 –
目前我这样做 生成的代码将有该属性和部分代码将有一个Property_Enum来回转换的值 –
这是一个坏主意,但这里的一般方法:
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所说,外键绝对更简洁/更易于使用。
更多的原因,这是一个坏主意:
[v] = right(SomeOtherColumn, 5)
,现在您必须解释它)sys
表(sys.check_constraints
)可能会在将来的版本中更改并且不被视为可靠的方法访问这些数据。你的代码可能无法在SQL升级中生存(而使用参考表)。更糟糕的是,它可能不会在升级时抛出异常,从而改变SQL服务器功能的使用,但它可能会产生一个很难在整个环境中追踪或重现的错误(例如,产品升级但dev不支持)。不是一个好主意,但一个很好的答案:绝对一个聪明的方法。 –
我明白Gordon Linoff可能是使用表格的最佳答案,但是我需要获得一种方式来指定表格用作C#中的Enum,而不是实际的对象,但是您在这里给出的是Exactly我的实验需要什么。我将接受戈登的答案(对于未来的读者),但我一定会玩这个代码 –
如果你想填充一个组合框,我会认为'List
它在服务器中以预先解析的形式存储,但是我知道用于提取约束信息的每个机制都会重新构造SQL。那么,你想把一个完整的SQL解析器放到你的系统中吗? –
是的,我想从服务器中提取完整的SQL,因为我可能能够分析该数据并从中得出结果 –