sql >> Databáze >  >> RDS >> Mysql

Rozdělit mysql dotazy do pole, každý dotaz oddělený;

Vzhledem k tomu, že řetězec obsahuje více příkazů SQL oddělených středníkem, následující funkce analyzuje každý jednotlivý příkaz a vrátí je všechny v poli. Používá jeden (netriviální) regulární výraz a jedno volání preg_match_all() a správně zpracovává jednořádkové a víceřádkové komentáře a řetězce s jednoduchými a dvojitými uvozovkami (každý z nich může obsahovat neukončující středníky, které je třeba ignorovat):

function split_sql($sql_text) {
    // Return array of ; terminated SQL statements in $sql_text.
    $re_split_sql = '%(?#!php/x re_split_sql Rev:20170816_0600)
        # Match an SQL record ending with ";"
        \s*                                     # Discard leading whitespace.
        (                                       # $1: Trimmed non-empty SQL record.
          (?:                                   # Group for content alternatives.
            \'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'  # Either a single quoted string,
          | "[^"\\\\]*(?:\\\\.[^"\\\\]*)*"      # or a double quoted string,
          | /\*[^*]*\*+(?:[^*/][^*]*\*+)*/      # or a multi-line comment,
          | \#.*                                # or a # single line comment,
          | --.*                                # or a -- single line comment,
          | [^"\';#]                            # or one non-["\';#-]
          )+                                    # One or more content alternatives
          (?:;|$)                               # Record end is a ; or string end.
        )                                       # End $1: Trimmed SQL record.
        %x';  // End $re_split_sql.
    if (preg_match_all($re_split_sql, $sql_text, $matches)) {
        return $matches[1];
    }
    return array();
}

Úprava 2017-08-15: Opravená chyba ve víceřádkové části komentáře v regulárním výrazu, na kterou upozornil @jxmallett.Úprava 16. 8. 2017: Uklidil regulární výraz (přidal regulární výraz shebang a odstranil nepotřebnou skupinu $2 ).



  1. Vytvořte datum z polí den, měsíc, rok v MySQL

  2. Tabulka odstraňování problémů Nenalezeny chyby

  3. Jak získat celkový počet nalezených řádků bez zohlednění limitu v PDO?

  4. SQL RANK() versus ROW_NUMBER()