Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server TSQL-如何在插入之前根据不同列中的值检查值?_Sql Server_Database_Check Constraints - Fatal编程技术网

Sql server TSQL-如何在插入之前根据不同列中的值检查值?

Sql server TSQL-如何在插入之前根据不同列中的值检查值?,sql-server,database,check-constraints,Sql Server,Database,Check Constraints,是否有一种方法可以实现一个检查约束,将同一表中不同列中的一个值与另一个值进行检查?具体来说,我希望在插入行之前确保要插入的“签出”日期值大于表中的“签入”日期值 我可能缺少一些详细信息,因此如果是这种情况,请告诉我。是的,MSSQL服务器(和其他服务器)允许-以便您可以比较列: ALTER TABLE tbl ADD CONSTRAINT chkCheckout_GT_Checkin CHECK (Ckeckout > Checkin) 您可以使用如下支票: ALTER TABL

是否有一种方法可以实现一个检查约束,将同一表中不同列中的一个值与另一个值进行检查?具体来说,我希望在插入行之前确保要插入的“签出”日期值大于表中的“签入”日期值

我可能缺少一些详细信息,因此如果是这种情况,请告诉我。

是的,MSSQL服务器(和其他服务器)允许-以便您可以比较列:

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

您可以使用如下支票:

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引擎。)

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

如果您只是希望insert失败,可以将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。

您可以尝试使用触发器。

对扩展where子句进行了向上投票!比触发器更明显、更容易管理。