SQL Server正在获取CHECK的值



是否有办法获得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);

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

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 server功能的升级时抛出异常,但它可能会产生一个难以追踪或跨环境重现的bug(即prod升级但dev没有)。

最新更新