Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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中不起作用_Sql_Sql Server 2008 R2_Sql Server 2012 - Fatal编程技术网

检查约束在SQL Server中不起作用

检查约束在SQL Server中不起作用,sql,sql-server-2008-r2,sql-server-2012,Sql,Sql Server 2008 R2,Sql Server 2012,我必须限制在有条件的表中插入重复数据 这是SQL Server表 CREATE TABLE [dbo].[temptbl]( [id] [numeric](18, 0) IDENTITY(1,1) NOT NULL, [DSGN] [varchar](500) NULL, [RecordType] [varchar](1000) NULL ) 如果RecordType为'SA'而非check CONSTRAINT(意味着如果DSGN=0且RecordType='SA'存

我必须限制在有条件的表中插入重复数据

这是SQL Server表

CREATE TABLE [dbo].[temptbl](
    [id] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [DSGN] [varchar](500) NULL,
    [RecordType] [varchar](1000) NULL
)
如果RecordType为'SA'而非check CONSTRAINT(意味着如果DSGN=0且RecordType='SA'存在,则我不想插入该数据),我想对RecordType设置条件

如果DSGN=1且RecordType='SA'不存在,则我希望插入该数据

如果RecordType不是“SA”,请插入任何数据

为此,我创建了约束,但它不起作用

ALTER TABLE temptbl  WITH CHECK  ADD CONSTRAINT chk_Stuff CHECK (([dbo].[chk_Ints]([DSGN],[RecordType])=(0)))
GO



ALTER FUNCTION [dbo].[chk_Ints](@Int_1 int,@Int_2 varchar(20))
RETURNS int
AS
BEGIN

DECLARE @Result INT

    BEGIN
        IF @Int_2 = 'SA'
        BEGIN
            IF NOT EXISTS (SELECT * FROM [temptbl] WHERE DSGN = @Int_1 AND RecordType = @Int_2)
            BEGIN
                SET @Result = 0
            END
            ELSE 
            BEGIN
                SET @Result = 1
            END
        END
        ELSE
        BEGIN
            SET @Result = 0
        END
    END 
    RETURN @Result
END

但它不起作用。请建议我放弃函数和检查约束:

CREATE UNIQUE INDEX IX_temptbl_SA ON temptbl (DSGN) WHERE RecordType='SA'
这就是我们所知道的


您的检查约束没有按预期工作,因为当为任何特定行计算检查约束时,该行在表中(在该事务的上下文中)已经可见因此,每一行都有效地阻止了自己的插入。

仅对新数据使用带有NOCheck的


是的,SA行必须具有唯一的DSGN感谢您的正确答案。但我有一个疑问…这些行是否可以在现有表上工作?我的意思是,从现在起,我必须防止这种情况发生。我必须保持旧记录不变。@Hiren使用NOCheck仅用于新数据。这里是提供的链接。您好,Valutah,这是对Hiren 2月23日评论问题的回答。我当时不能发表我的评论,因为名声不好。希望你理解我为什么要回答这个问题。我在这里再次重复海伦的评论“谢谢你的正确答案。但我有一个疑问……这些能在现有的桌子上工作吗?我的意思是,从现在起我必须防止这种情况。我必须保持旧记录不变。”——Hiren gardhariya 2月23日。