这句话是做什么的@@ RowCount> 0

时间:2013-12-20 15:51:01

标签: sql-server entity-framework tsql

取自本书:“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

这是对的吗?

3 个答案:

答案 0 :(得分:4)

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

如果他们使用@@Rowcount > 1代替,则该陈述永远不会成立。该insert语句只插入1行。 1不是> 1.

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

我会用这个替换它......

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()