Sql server 插入/更新时如何验证字段的最佳方法

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

我正在尝试使用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');
提前谢谢

您可以在
名称
列中尝试使用
状态“已删除”

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只想要一个。