【问题标题】:What does this statement do @@RowCount > 0这个语句做了什么@@RowCount > 0
【发布时间】:2013-12-20 15:51:00
【问题描述】:

摘自本书:“Julia Lerman - 编程实体框架”

在 EF 中创建新实体时:

   var contact = Contact.CreateContact(0, "Camey", "Combs", DateTime.Now, DateTime.Now);
   context.Contacts.AddObject(contact);
   context.SaveChanges(); 

生成的sql:

   exec sp_executesql N'insert [dbo].[Contact]([FirstName], [LastName], [Title],
   [AddDate], [ModifiedDate])
   values (@0, @1, null, @2, @3)
   select [ContactID]
   from [dbo].[Contact]
   where @@ROWCOUNT > 0 and [ContactID] = scope_identity()',
   N'@0 nvarchar(50),@1 nvarchar(50),@2 datetime2(7),@3 datetime2(7)',
   @0=N'Camey',@1=N'Combs',@2='2009-08-30 09:27:31.7449098',
   @3='2009-11-30 09:27:31.7449098'

@@RowCount > 0 在 where 子句中用于什么?

我不确定它根据 msdn 会返回受影响的行数, 据我了解,这只是验证已添加联系人记录的一种方式 他们也可以写@@ROWCOUNT = 1

这是正确的吗?

【问题讨论】:

  • 对基表的查询似乎没有必要。您可以对SELECT scope_identity() AS ContactID WHERE @@ROWCOUNT > 0 执行相同的操作,除非获取返回的ContactID 的确切数据类型很重要。也许检查触发器并没有改变我认为的任何东西。

标签: sql-server entity-framework tsql


【解决方案1】:

@@Rowcount 是一个特殊变量。它将始终保存最后一条语句更改或返回的记录数。在这种情况下,最后一个语句是插入。通过在 where 子句中使用 @@Rowcount > 0,您可以确保 select 仅在 insert 语句成功时匹配任何记录。

如果他们改用@@Rowcount > 1,那这句话就永远不会成立。该插入语句将仅插入 1 行。 1 不 > 1。

【讨论】:

  • 对不起,我在写之前犯了一个错误,他们可以写@@RowCount = 1,请参阅上面的编辑
  • @eranotzap 在这种情况下,= 1 想要工作。在一般情况下,最好使用> 0,因为您可以编写将创建多行的插入语句。
  • 是的,我明白了,我只是想针对这种特定情况验证检查是否针对因插入而受影响的一行。
【解决方案2】:

@@Rowcount = 最后一条语句影响的行数

在您的情况下,这会检查插入是否遇到错误,例如具有相同主键的行

【讨论】:

    【解决方案3】:

    该查询中没有任何内容需要您使用动态 SQL。我还发现在“where”子句中做那种@@rowcount 检查有点傻。由于您刚刚插入,因此它会在到达该 select 语句之前因错误而中断,或者 @@rowcount 条件将始终为真。

    我会用这个代替它...

    INSERT INTO [dbo].[Contact](
        [FirstName], [LastName], [Title],[AddDate], [ModifiedDate])
    VALUES (N'Camey', N'Combs', null, '2009-08-30 09:27:31.7449098', '2009-11-30 09:27:31.7449098')
    
    SELECT SCOPE_IDENTITY()
    

    此外,您尝试插入的日期时间值可能应该替换为 GETDATE()

    这是@@rowcount 的文档 这里是scope_identity()

    【讨论】:

    • 也许某些数据库中的某些配置不会因异常而中断,因此这可能是执行该检查的好理由。 (但这只是一个有根据的猜测)
    猜你喜欢
    • 2021-08-22
    • 2017-07-17
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多