Merge pull request #220 from Bugadinho/return-sqlserver

Implement returning method on SQL Server
This commit is contained in:
Huan Du
2025-10-10 15:37:44 +08:00
committed by GitHub
7 changed files with 40 additions and 3 deletions
+9
View File
@@ -223,6 +223,15 @@ func (db *DeleteBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
db.injection.WriteTo(buf, deleteMarkerAfterDeleteFrom)
if flavor == SQLServer {
if len(db.returning) > 0 {
buf.WriteLeadingString("OUTPUT ")
buf.WriteStringsPrefixed("DELETED.", db.returning, ", ")
}
db.injection.WriteTo(buf, insertMarkerAfterReturning)
}
if db.WhereClause != nil {
db.whereClauseProxy.WhereClause = db.WhereClause
defer func() {
+1 -1
View File
@@ -129,7 +129,7 @@ func TestDeleteBuilderReturning(t *testing.T) {
a.Equal("DELETE FROM user WHERE id = ? RETURNING id, deleted_at", sql)
sql, _ = db.BuildWithFlavor(SQLServer)
a.Equal("DELETE FROM user WHERE id = @p1", sql)
a.Equal("DELETE FROM user OUTPUT DELETED.id, DELETED.deleted_at WHERE id = @p1", sql)
sql, _ = db.BuildWithFlavor(CQL)
a.Equal("DELETE FROM user WHERE id = ?", sql)
+9
View File
@@ -200,6 +200,15 @@ func (ib *InsertBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
ib.injection.WriteTo(buf, insertMarkerAfterCols)
}
if flavor == SQLServer {
if len(ib.returning) > 0 {
buf.WriteLeadingString("OUTPUT ")
buf.WriteStringsPrefixed("INSERTED.", ib.returning, ", ")
}
ib.injection.WriteTo(buf, insertMarkerAfterReturning)
}
if ib.sbHolder != "" {
buf.WriteString(" ")
buf.WriteString(ib.sbHolder)
+1 -1
View File
@@ -275,7 +275,7 @@ func TestInsertBuilderReturning(test *testing.T) {
a.Equal("INSERT INTO user (name) VALUES (?) RETURNING id", sql)
sql, _ = ib.BuildWithFlavor(SQLServer)
a.Equal("INSERT INTO user (name) VALUES (@p1)", sql)
a.Equal("INSERT INTO user (name) OUTPUT INSERTED.id VALUES (@p1)", sql)
sql, _ = ib.BuildWithFlavor(CQL)
a.Equal("INSERT INTO user (name) VALUES (?)", sql)
+10
View File
@@ -56,6 +56,16 @@ func (sb *stringBuilder) WriteStrings(ss []string, sep string) {
}
}
func (sb *stringBuilder) WriteStringsPrefixed(prefix string, ss []string, sep string) {
prefixedSs := []string{}
for _, s := range ss {
prefixedSs = append(prefixedSs, prefix+s)
}
sb.WriteStrings(prefixedSs, sep)
}
func (sb *stringBuilder) WriteRune(r rune) {
sb.builder.WriteRune(r)
}
+9
View File
@@ -301,6 +301,15 @@ func (ub *UpdateBuilder) BuildWithFlavor(flavor Flavor, initialArg ...interface{
ub.injection.WriteTo(buf, updateMarkerAfterSet)
if flavor == SQLServer {
if len(ub.returning) > 0 {
buf.WriteLeadingString("OUTPUT ")
buf.WriteStringsPrefixed("INSERTED.", ub.returning, ", ")
}
ub.injection.WriteTo(buf, insertMarkerAfterReturning)
}
if flavor != MySQL {
// For ISO SQL, CTE table names should be written after FROM keyword.
if ub.cteBuilder != nil {
+1 -1
View File
@@ -197,7 +197,7 @@ func TestUpdateBuilderReturning(t *testing.T) {
a.Equal("UPDATE user SET name = ? WHERE id = ? RETURNING id, updated_at", sql)
sql, _ = ub.BuildWithFlavor(SQLServer)
a.Equal("UPDATE user SET name = @p1 WHERE id = @p2", sql)
a.Equal("UPDATE user SET name = @p1 OUTPUT INSERTED.id, INSERTED.updated_at WHERE id = @p2", sql)
sql, _ = ub.BuildWithFlavor(CQL)
a.Equal("UPDATE user SET name = ? WHERE id = ?", sql)