C# TransactionScope检查约束失败

C# TransactionScope检查约束失败,c#,sql-server,transactionscope,check-constraints,C#,Sql Server,Transactionscope,Check Constraints,我在SQL Server中使用TransactionScope和检查约束时遇到问题 我想在表中插入如下内容: Col A | Col B ------------ Dave | 0 Fred | 1 该表有一个检查约束,即B列中必须始终有一个带有“0”的条目。第一行插入良好,但第二行未通过约束 command.CommandText = @"INSERT INTO MyTable (ColA, ColB) VALUES(@ColA, @ColB)";

我在SQL Server中使用TransactionScope和检查约束时遇到问题

我想在表中插入如下内容:

Col A | Col B
------------
 Dave |  0
 Fred |  1
该表有一个检查约束,即B列中必须始终有一个带有“0”的条目。第一行插入良好,但第二行未通过约束

command.CommandText = @"INSERT INTO MyTable (ColA, ColB) VALUES(@ColA, @ColB)";                                   

            foreach (var row in model.Rows)
            {

                    command.Parameters["@ColA"].Value = model.ColA;
                    command.Parameters["@ColB"].Value = model.ColB;

                    command.ExecuteNonQuery();

            }
check约束调用以下函数

IF EXISTS (SELECT * FROM mytable WHERE ColB = 0) RETURN 1

RETURN 0

这可能是因为约束只查看已提交的数据,如果是,如何告知它也查看未提交的数据?我认为检查约束不适合您这样的场景。您应该使用而不是更新/插入来检查是否至少有一行(在表和/或插入的值中)

触发器中有一个插入的表,其中包含将插入的所有行,因此可以编写如下内容:

IF NOT EXISTS (SELECT * FROM mytable a UNION inserted WHERE ColB = 0) RIASEERROR("At least one row with ColB=0 should exist")

如果看不到约束的定义,就不可能真正知道发生了什么。@Damien_不信者只是在添加。为什么
CHECK
为这么简单的事情调用函数?约束应该简单地定义为colB=0。一个更有趣的问题可能是,当colB始终具有相同的值0时,为什么还要使用colB?它可以全部删除吗?@Alejandro我认为约束应该检查所有数据,而不是单个行。