C# Insert into view返回受影响的2行

C# Insert into view返回受影响的2行,c#,.net,sql-server,view,insert,C#,.net,Sql Server,View,Insert,在SQLServer2005中,我有两个数据库。在第一张表中,我有一张这样的表: 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,sgN

在SQLServer2005中,我有两个数据库。在第一张表中,我有一张这样的表:

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
第二种观点是:

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
用这样的触发器:

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);
}

我得到的affectedRows等于2,而我的期望值是1。

这种问题通常让我想到“触发器”

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

我的意思是,当我执行insert时,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
问题是原始数据库上的触发器和实际表都报告它们已更新了一行。如果从触发器中删除此报告,但将其保留在原始数据库中,则无论是通过视图更新还是直接进入原始表,都将始终得到真实答案