Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为更新中的int指定上限_Sql_Sql Server_Entity Framework_Tsql - Fatal编程技术网

Sql 为更新中的int指定上限

Sql 为更新中的int指定上限,sql,sql-server,entity-framework,tsql,Sql,Sql Server,Entity Framework,Tsql,给定一个表,例如Article(Id,Body,Revisions),我想增加Revisions属性,一旦达到某个限制(这是开发人员提供的常量),就会抛出一个错误。这是否可以通过一次更新实现。。。T-SQL中的SET语句 我所做的: 要按1递增修订属性,我解决了如下问题: 问题 找到一种线程安全的方法,允许增加修订,直到达到某个上限 上下文 由于我使用EF,理想的解决方案是抛出错误或指定某种标志。我正在使用的代码(如下所示)被封装到一个try-catch中: context.Datab

给定一个表,例如Article(Id,Body,Revisions),我想增加Revisions属性,一旦达到某个限制(这是开发人员提供的常量),就会抛出一个错误。这是否可以通过一次更新实现。。。T-SQL中的SET语句

我所做的:

  • 要按1递增修订属性,我解决了如下问题:
问题

  • 找到一种线程安全的方法,允许增加修订,直到达到某个上限
上下文

由于我使用EF,理想的解决方案是抛出错误或指定某种标志。我正在使用的代码(如下所示)被封装到一个try-catch中:

 context.Database.ExecuteSqlCommand("UPDATE dbo.Articles SET Revisions = Revisions + 1 WHERE Id=@p0;", articleId);
如果限值是100

UPDATE Article
SET Revisions = LEAST(Revisions + 1, 100)
where Id = @p0
如果限值是100

UPDATE Article
SET Revisions = LEAST(Revisions + 1, 100)
where Id = @p0

使用检查约束。update语句不能违反由CHECK约束实现的边界。甚至连睡眠剥夺DBA在控制台发出的update语句都没有

create table article (
   id integer primary key,
   body nvarchar(max) not null,
   -- Allow six versions. (Original plus five revisions.)
   revisions integer not null
      check (revisions between 0 and 5)
);

insert into article values (1, 'a', 0);

update article 
set body = 'b', revisions = 1 
where id = 1;

update article 
set body = 'c', revisions = 2 
where id = 1;

-- Other updates . . .

-- This update will *always* fail with an error.
update article
set body = 'f', revisions = 6 
where id = 1;

使用检查约束。update语句不能违反由CHECK约束实现的边界。甚至连睡眠剥夺DBA在控制台发出的update语句都没有

create table article (
   id integer primary key,
   body nvarchar(max) not null,
   -- Allow six versions. (Original plus five revisions.)
   revisions integer not null
      check (revisions between 0 and 5)
);

insert into article values (1, 'a', 0);

update article 
set body = 'b', revisions = 1 
where id = 1;

update article 
set body = 'c', revisions = 2 
where id = 1;

-- Other updates . . .

-- This update will *always* fail with an error.
update article
set body = 'f', revisions = 6 
where id = 1;

您可以在
UPDATE
语句中使用
WHERE
子句来完成此操作,这将完成测试。如果测试失败,更新将不会发生,您对
context.Database.ExecuteSqlCommand
的调用将返回0而不是1

如果限制为1000,则更新SQL为:

count = context.Database.ExecuteSqlCommand(
  "UPDATE dbo.Articles SET Revisions = Revisions + 1 WHERE Id=@p0 AND Revisions < 1000;", articleId);
count=context.Database.ExecuteSqlCommand(
“更新dbo.Articles SET Revisions=Revisions+1,其中Id=@p0,Revisions<1000;”,articleId);

然后,您将测试
count==0
,如果是,则会发出错误消息。

您可以在
UPDATE
语句中使用
WHERE
子句来执行此操作,该子句将执行测试。如果测试失败,更新将不会发生,您对
context.Database.ExecuteSqlCommand
的调用将返回0而不是1

如果限制为1000,则更新SQL为:

count = context.Database.ExecuteSqlCommand(
  "UPDATE dbo.Articles SET Revisions = Revisions + 1 WHERE Id=@p0 AND Revisions < 1000;", articleId);
count=context.Database.ExecuteSqlCommand(
“更新dbo.Articles SET Revisions=Revisions+1,其中Id=@p0,Revisions<1000;”,articleId);
然后,您将测试count==0,如果是,则会发出错误消息。

有点重,但是

UPDATE dbo.Articles 
SET Revisions = Revisions + 1 
WHERE Id=@p0
AND sqrt(Revisions - @MaxRevisions - 2) >= 0;
如果修订-@Revisions-2为负数,则将抛出

发生无效的浮点操作

错误

有点重,但是

UPDATE dbo.Articles 
SET Revisions = Revisions + 1 
WHERE Id=@p0
AND sqrt(Revisions - @MaxRevisions - 2) >= 0;
如果修订-@Revisions-2为负数,则将抛出

发生无效的浮点操作



错误

我在想什么样的错误?数据库引擎出现异常?或者您是否有一个连接到数据库引擎的编程环境来触发错误?@trincot,请查看更新的“上下文”部分您认为是哪种错误?数据库引擎出现异常?或者您是否有一个连接到数据库引擎的编程环境来触发错误?@trincot,请参阅更新的“上下文”部分如果修订版+1 isg大于100,这会引发某种错误吗?不,不会。很抱歉,我错过了这个要求。如果修订版+1 isg大于100,这会抛出某种错误吗?不会。抱歉,我错过了这个要求。我认为在这种情况下,检查约束将强制属性修订中的所有值满足此条件。有没有办法只对一行执行此操作?您可以向表中添加一列
revision\u limit
,并将约束更改为
revisions介于0和revision\u limit之间。这使您能够为每行指定单独的修订限制。您还可以向表中添加一个布尔列
unlimited\u revisions
,并使约束
unlimited\u revisions或(0和revision\u limit之间的修订)
@Artem:您真的希望只有一行对修订数量有约束吗,或者,是否希望每一行对修订数量具有不同的约束?在任何一种情况下,请考虑编辑您的问题,并澄清您所说的开发人员提供的常量是什么意思。@Mike Sherrill“Cat Recall”,是的,我使用了修订id作为更大问题的简化示例。无论如何,谢谢你的回答!:)如果有人想在所有属性上强制执行此规则,那么它将在解决方案中起作用。我认为在这种情况下,检查约束将强制属性修订中的所有值满足此条件。有没有办法只对一行执行此操作?您可以向表中添加一列
revision\u limit
,并将约束更改为
revisions介于0和revision\u limit之间。这使您能够为每行指定单独的修订限制。您还可以向表中添加一个布尔列
unlimited\u revisions
,并使约束
unlimited\u revisions或(0和revision\u limit之间的修订)
@Artem:您真的希望只有一行对修订数量有约束吗,或者,是否希望每一行对修订数量具有不同的约束?在任何一种情况下,请考虑编辑您的问题,并澄清您所说的开发人员提供的常量是什么意思。@Mike Sherrill“Cat Recall”,是的,我使用了修订id作为更大问题的简化示例。无论如何,谢谢你的回答!:)如果有人想在所有属性上强制执行此规则,那么它将在解决方案中起作用。谢谢您的回答!这个解决方案非常适合我!也许一个小缺点是,当对象不存在时,count=0将为零。然而,这在我的问题上并不重要。再次感谢!:)A.