github.com/Ali-iotechsys/sqlboiler/v4@v4.0.0-20221208124957-6aec9a5f1f71/drivers/sqlboiler-mssql/driver/override/main/singleton/mssql_upsert.go.tpl (about) 1 // buildUpsertQueryMSSQL builds a SQL statement string using the upsertData provided. 2 func buildUpsertQueryMSSQL(dia drivers.Dialect, tableName string, primary, update, insert []string, output []string) string { 3 insert = strmangle.IdentQuoteSlice(dia.LQ, dia.RQ, insert) 4 5 buf := strmangle.GetBuffer() 6 defer strmangle.PutBuffer(buf) 7 8 startIndex := 1 9 10 fmt.Fprintf(buf, "MERGE INTO %s as [t]\n", tableName) 11 fmt.Fprintf(buf, "USING (SELECT %s) as [s] ([%s])\n", 12 strmangle.Placeholders(dia.UseIndexPlaceholders, len(primary), startIndex, 1), 13 strings.Join(primary, string(dia.RQ)+","+string(dia.LQ))) 14 fmt.Fprint(buf, "ON (") 15 for i, v := range primary { 16 if i != 0 { 17 fmt.Fprint(buf, " AND ") 18 } 19 fmt.Fprintf(buf, "[s].[%s] = [t].[%s]", v, v) 20 } 21 fmt.Fprint(buf, ")\n") 22 23 startIndex += len(primary) 24 25 if len(update) > 0 { 26 fmt.Fprint(buf, "WHEN MATCHED THEN ") 27 fmt.Fprintf(buf, "UPDATE SET %s\n", strmangle.SetParamNames(string(dia.LQ), string(dia.RQ), startIndex, update)) 28 29 startIndex += len(update) 30 } 31 32 fmt.Fprint(buf, "WHEN NOT MATCHED THEN ") 33 fmt.Fprintf(buf, "INSERT (%s) VALUES (%s)", 34 strings.Join(insert, ", "), 35 strmangle.Placeholders(dia.UseIndexPlaceholders, len(insert), startIndex, 1)) 36 37 if len(output) > 0 { 38 fmt.Fprintf(buf, "\nOUTPUT INSERTED.[%s];", strings.Join(output, "],INSERTED.[")) 39 } else { 40 fmt.Fprint(buf, ";") 41 } 42 43 return buf.String() 44 }