TSQL - 如何在插入之前针对不同列中的值检查值?

时间:2009-05-02 02:58:46

标签: sql-server database check-constraints

有没有办法实现CHECK约束,该约束检查同一个表中不同列中另一个值的值?具体来说,我想确保在插入行之前插入的“checkout”日期值大于表中的“checkin”日期值。

我可能会遗漏一些细节,所以如果是这样,请告诉我。

3 个答案:

答案 0 :(得分:4)

是的,MSSQL Server(和其他人)允许CHECK CONSTRAINTS on the table - 以便您可以比较列:

ALTER TABLE tbl ADD CONSTRAINT chkCheckout_GT_Checkin
    CHECK (Ckeckout > Checkin)

答案 1 :(得分:2)

您可以使用以下支票:

ALTER TABLE dbo.myTable ADD CONSTRAINT CK_myTable_CheckoutGreaterThanCheckin
CHECK (dbo.CheckDates()>1)

然后添加如下函数:

CREATE FUNCTION CheckDates()
RETURNS int
AS 
BEGIN
    DECLARE @retval int
    SET @retval = (SELECT COUNT(*) FROM myTable WHERE checkout > checkin)
    RETURN @retval
END;

那些可能无法正常工作(抱歉目前无法访问SQL引擎。)

或者您可能希望在查询中包含检查,以便在检查失败时不必在代码中使用错误处理。

如果您只想让插入失败,可以将where子句扩展为:

INSERT INTO myTable (checkout) 
VALUES(@checkout) 
WHERE @checkout > @checkin AND IDcolumn = @IDcolumn

如果您想要返回某些类型的指示符,表明存在问题,您可以使用上面的内容但添加SELECT @@ ROWCOUNT,或者您可以使用提前检查该值:

DECLARE @var int
SET @var = (SELECT count(*)
FROM myTable
WHERE @checkout > checkin AND IDcolumn = @IDcolumn)
如果值传递,

@var将等于1。

答案 2 :(得分:0)

您可以尝试使用触发器。