Your Question

I'm trying to insert some values using the Create functions but, since there's an indication about the Primary Key, it automatically adds "OUTPUT INSERTED.ID" into the INSERT INTO returning an error since the table has a trigger. [FIRST CASE]

BUT

If I remove the primary key, it returns "6 rows affected" even if it adds only one row. [SECOND CASE]

I'm using gorm v1.22.5 and dialect gorm.io/driver/sqlserver v1.2.1

The document you expected this should be explained

First Case:

mssql: The target table 'TABLENAME' of the DML statement cannot have any enabled triggers if the statement contains an OUTPUT clause without INTO clause.

Second Case:

[65.347ms] [rows:6] INSERT INTO "TABLENAME" ([...]) VALUES ([...]);

Expected answer

Why does it show 6 rows affected? Is there a way to have the ID of the inserted value without using the OUTPUT clause?

Comment From: RMTTyszka

Any news about that? Anyone found a solution? We are having the same issue I supposed it should work, since with other ORMs that works pretty fine

I manage to make it work but i'm not proud of myself, i just hope we have a solution soon

Comment From: RMTTyszka

@AntonioBusillo By the way, the 6 rows are not other actions related to the triggers?

Comment From: juddbaguio

@RMTTyszka would you mind sharing your workaround?

Comment From: simoneserra93

I'm facing the same problem. We mostly managed it by using a struct without the primary key defined, this stops gorm adding the OUTPUT clause. Of course this also stops gorm retrieving the inserted ID, so we have to perform a SELECT after the INSERT when we need the ID.

Has anyone better ideas?

Comment From: RubensTen

Hi, I have the same issue :( The workaround that I tested with my team is using a replace function to remove the OUTPUT, we know this is not the best approach but works

    sql := s.db.GetDb().ToSQL(func(tx *gorm.DB) *gorm.DB {
        return tx.Create(data)
    })
   // from the insert sql generated, delete the OUTPUT 
    sql = strings.Replace(sql, ^OUTPUT INSERTED\."(\w+)", "", 1)
    tx := s.db.GetDb().Exec(sql)

Comment From: raulci

See also here. I proposed a workaround. Note that the issue is more related to the sql-server driver and not directly to gorm.