sle*_*esh 1 t-sql sql-server validation user-defined-functions
我正在尝试使用 CHECK + UDF 应用自定义验证,尽管如此,它在我的情况下无法正常工作,而且在搜索后有一种观点认为这种方法可能会影响性能并且不稳健。
T-SQL 中是否有一些现有工具可以解决我的问题?
这是我的sql:
DROP TABLE IF EXISTS dbo.test_name_uniq;
CREATE TABLE dbo.test_name_uniq (
name VARCHAR(255),
state VARCHAR(255)
)
ALTER TABLE dbo.test_name_uniq DROP CONSTRAINT IF EXISTS test_name_uniq_constraint;
DROP FUNCTION IF EXISTS dbo.validate_test_name_uniq;
GO
CREATE FUNCTION dbo.validate_test_name_uniq(@name VARCHAR(255))
RETURNS BIT
AS
BEGIN
DECLARE @unique_name BIT = 0;
SELECT @unique_name = CASE
WHEN COUNT(*) > 0
THEN 0
ELSE 1
END
FROM dbo.test_name_uniq i
WHERE i.name = @name AND i.state <> 'Removed';
RETURN @unique_name;
END;
GO
ALTER TABLE dbo.test_name_uniq
WITH NOCHECK ADD CONSTRAINT test_name_uniq_constraint CHECK (dbo.validate_test_name_uniq(name) = 1 );
GO
DELETE FROM dbo.test_name_uniq;
GO
INSERT INTO dbo.test_name_uniq (name, state) VALUES
('Test application', 'Active');
Run Code Online (Sandbox Code Playgroud)
每次当我尝试插入一行时,都会收到错误:
INSERT 语句与 CHECK 约束“test_name_uniq_constraint”冲突。冲突发生在数据库“data_local_test”,表“dbo.test_name_uniq”,列“name”中。
您可以尝试在列上使用唯一过滤索引,name其中state<>'Removed':
CREATE UNIQUE INDEX uix_name
ON dbo.test_name_uniq (name)
WHERE where state<> 'Removed';
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |