Sql server 检查约束不';我不能在SQL Server 2016中工作
下面我有一个简单的例子Sql server 检查约束不';我不能在SQL Server 2016中工作,sql-server,tsql,constraints,Sql Server,Tsql,Constraints,下面我有一个简单的例子 begin tran CREATE TABLE [dbo].[Filters] ( [Id] INT NOT NULL IDENTITY, [FCode] varchar(30) null, [FVersion] varbinary(892) null, CONSTRAINT [PK_Filter] PRIMARY KEY CLUSTERED
begin tran
CREATE TABLE [dbo].[Filters]
(
[Id] INT NOT NULL IDENTITY,
[FCode] varchar(30) null,
[FVersion] varbinary(892) null,
CONSTRAINT [PK_Filter] PRIMARY KEY CLUSTERED ([Id]),
CONSTRAINT [CK_Filters_FCode_FVersion]
CHECK (([FCode] IS NULL AND [FVersion] IS NULL)
OR (LEN([FCode]) > 0 AND DATALENGTH([FVersion]) > 0)),
)
INSERT INTO [dbo].[Filters] (FCode, FVersion)
VALUES (NULL, NULL),
(NULL, 0x6BE348),
('ASD', NULL),
('ASD', 0x6BE348)
SELECT
IIF(([FCode] IS NULL AND [FVersion] IS NULL)
OR (LEN([FCode]) > 0 AND DATALENGTH([FVersion]) > 0) , 1, 0) AS [check], *
FROM
[dbo].[filters]
rollback
我预计第2条和第3条insert语句将导致约束冲突。然而,服务器允许它们
在中,使用select语句查看第2行和第3行是否违反了约束检查的值。看到结果了吗
check Id FCode FVersion
------------------------------
1 1 NULL NULL
0 2 NULL 0x6BE348
0 3 ASD NULL
1 4 ASD 0x6BE348
有什么想法吗?只有当值确定为
false
时,检查约束才会失败
期望违反约束的表达式的计算结果为UNKNOWN
你可以看到这个
SELECT CASE
WHEN( ( [FCode] IS NULL
AND [FVersion] IS NULL )
OR ( LEN([FCode]) > 0
AND DATALENGTH([FVersion]) > 0 ) ) THEN 'True'
WHEN NOT ( ( [FCode] IS NULL
AND [FVersion] IS NULL )
OR ( LEN([FCode]) > 0
AND DATALENGTH([FVersion]) > 0 ) ) THEN 'False'
ELSE 'Unknown'
END AS [check],
LEN([FCode]) AS LenFCode,
DATALENGTH([FVersion]) AS DataLengthFVersion,
*
FROM [dbo].[filters]
返回
+---------+----------+--------------------+----+-------+----------+
| check | LenFCode | DataLengthFVersion | Id | FCode | FVersion |
+---------+----------+--------------------+----+-------+----------+
| True | NULL | NULL | 1 | NULL | NULL |
| Unknown | NULL | 3 | 2 | NULL | 0x6BE348 |
| Unknown | 3 | NULL | 3 | ASD | NULL |
| True | 3 | 3 | 4 | ASD | 0x6BE348 |
+---------+----------+--------------------+----+-------+----------+
它们之所以未知
是因为LEN
和DATALENGTH
在传递NULL
时都返回NULL
,的答案已经包含了SQL server允许指定值而不违反检查约束的原因
您可以将检查约束修改为以下内容以使其生效
非常感谢。这就是原因,很好的例子
CONSTRAINT [CK_Filters_FCode_FVersion]
CHECK (([FCode] IS NULL AND [FVersion] IS NULL)
OR (LEN(ISNULL([FCode],'')) > 0
AND ISNULL(DATALENGTH([FVersion]),-1) > 0))