插入视图返回 2 行受影响

Posted

技术标签:

【中文标题】插入视图返回 2 行受影响【英文标题】:Insert into view returns 2 rows affected 【发布时间】:2011-06-30 11:53:47 【问题描述】:

在 Sql Server 2005 中,我有两个数据库。在第一个中,我有一个这样的表:

CREATE TABLE [dbo].[SG](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [sgName] [nvarchar](50) NOT NULL,
    [active] [bit] NOT NULL,
    [hiddenf] [int] NOT NULL
)

第二个,我有这样的看法:

CREATE VIEW [dbo].[SG] AS   
    SELECT id,sgName, active 
    FROM [FirstDatabase].dbo.SG WHERE hiddenf = 1

使用这样的触发器:

CREATE TRIGGER [dbo].[InsteadTriggerSG] on [dbo].[SG] 
INSTEAD OF INSERT AS BEGIN 
   INSERT INTO [FirstDatabase].dbo.SG(sgName,active,hiddenf)
   SELECT sgName,COALESCE (active,0), 1 FROM inserted 
END

当我插入视图时:

using (SqlConnection connection = new SqlConnection(
               connectionString))

   SqlCommand command = new SqlCommand("INSERT INTO SG(sgName, active) VALUES('Test', 1)", connection);
   var affectedRows = command.ExecuteNonQuery();
   Assert.AreEqual(1, affectedRows);

我的受影响行数等于 2,而我的预期值为 1。

【问题讨论】:

【参考方案1】:

这类问题通常会让我想到“触发器”。

我刚刚创建了您的场景的精确副本(感谢您的详细说明),我看到了类似的结果。

我的意思是当我执行插入时,SSMS 输出

(受影响的 1 行)

(受影响的 1 行)

但是当我检查原始数据库时,只添加了一行。

要解决您的问题,请执行以下操作:

ALTER TRIGGER [dbo].[InsteadTriggerSG] on [dbo].[SG] 
INSTEAD OF INSERT AS BEGIN 
   SET NOCOUNT ON -- adding this in stops it from reporting from in here
   INSERT INTO [TEST].dbo.SG(sgName,active,hiddenf)
   SELECT sgName,COALESCE (active,0), 1 FROM inserted 
END

问题是原始数据库上的触发器和实际表都报告他们已经更新了一行。如果您从触发器中删除此报告,但将其保留在原始数据库中,则无论您是通过视图更新还是直接直接进入原始表,您都将始终得到正确的答案。

【讨论】:

以上是关于插入视图返回 2 行受影响的主要内容,如果未能解决你的问题,请参考以下文章

SCOPE_IDENTITY() 返回 NULL?

这样的SQL语句(游标)为啥要被重复执行5次? (5 行受影响) (5 行受影响) (5 行受影响) (5 行受影响) (5

为啥我会得到额外的(1 行受影响)[重复]

插入视图不返回主键

SQL Server返回插入数据的ID和受影响的行数

SQL Server返回插入数据的ID和受影响的行数