Sql server 插入/更新时如何验证字段的最佳方法
我正在尝试使用CHECK+UDF应用自定义验证,但是,在我的情况下,它不能正常工作,而且在搜索之后,有一种观点认为这种方法可能会影响性能,而且不可靠 T-SQL中是否有一些现有的工具来解决我的问题 以下是我的sql:Sql server 插入/更新时如何验证字段的最佳方法,sql-server,validation,tsql,user-defined-functions,Sql Server,Validation,Tsql,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
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');
提前谢谢 您可以在名称
列中尝试使用状态“已删除”
:
CREATE UNIQUE INDEX uix_name
ON dbo.test_name_uniq (name)
WHERE where state<> 'Removed';
创建唯一索引uix\u名称
关于dbo.test\u name\u uniq(name)
“移除”状态的位置;
希望对您有所帮助。您可以尝试在名称
的列中声明“已删除”
:
CREATE UNIQUE INDEX uix_name
ON dbo.test_name_uniq (name)
WHERE where state<> 'Removed';
创建唯一索引uix\u名称
关于dbo.test\u name\u uniq(name)
“移除”状态的位置;
希望有帮助。约束是检查函数validate\u inventory的结果,而不是validate\u test\u name_uniq@Jayvee,这是一个打字错误,我修复了它。语法在我的服务器上甚至无效提示:当检查是否存在一行或多行时,使用它比获得准确的行,然后只检查它是否大于零更有效。约束是检查函数validate\u inventory的结果,而不是validate\u test\u name_uniq@Jayvee,这是一个打字错误,我修复了它。语法在我的服务器上甚至无效提示:当检查一行或多行的存在时,使用它比得到一个精确的值,然后只检查它是否大于零更有效。实际上,我认为状态“已删除”的位置应该是
,
,但无论如何+1。事实上,这将是最好的方法。我假设state
只有两个可能的值,但这可能不是真的。谢谢我不认为这与OP的意图相同。这允许多个唯一的。OP在我阅读时只需要一个。实际上我认为应该是状态“已删除”
,但无论如何+1。事实上,这将是最好的方法。我假设state
只有两个可能的值,但这可能不是真的。谢谢我不认为这与OP的意图相同。这允许多个唯一的。我读的时候OP只想要一个。