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  }