/// <summary> /// Convierte una cláusula de INSERT a string. /// Si el INSERT devuelve valores. /// /// Devuelve ya sea un <see cref="InsertNoReturningStrResult"/> o un <see cref="InsertReturningToStr"/> /// </summary> public static StatementToStrResult InsertToString(InsertClause clause, ParamMode paramMode, SqlParamDic paramDic) { var b = new StringBuilder(); b.Append("INSERT INTO "); b.Append($"\"{clause.Table}\" "); if ((clause.Value == null) == (clause.Query == null)) { throw new ArgumentException("Query debe de ser null si value no es null"); } if (clause.Value != null) { b.Append(InsertValueToString(clause, paramMode, paramDic)); } else { //Query var sqlQuery = SqlSelect.SelectToStringScalar(clause.Query, paramMode, paramDic); //Texto de las columnas: b.Append("("); b.Append(string.Join(", ", sqlQuery.Columns)); b.AppendLine(")"); b.Append(sqlQuery.Sql); } if (clause.OnConflict != null) { b.AppendLine(); b.Append(OnConflict(clause.OnConflict, paramMode, paramDic, clause.Table)); } //Columnas del returning IReadOnlyList <string> columns = null; if (clause.Returning != null) { b.AppendLine(); var returning = ReturningToString(clause.Returning, paramMode, paramDic, clause.Table); b.Append(returning.sql); columns = returning.cols; } var sql = b.ToString(); if (columns != null) { return(new InsertReturningToStr(sql, columns)); } return(new InsertNoReturningStrResult(sql)); }