Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Podziel zapytania mysql w tablicy, każde zapytanie oddzielone;

Biorąc pod uwagę ciąg zawierający wiele instrukcji SQL oddzielonych średnikami, następująca funkcja analizuje poszczególne instrukcje i zwraca je wszystkie w postaci tablicy. Używa jednego (nietrywialnego) wyrażenia regularnego i jednego wywołania preg_match_all() , i poprawnie obsługuje komentarze jedno- i wielowierszowe oraz ciągi w pojedynczym i podwójnym cudzysłowie (każdy z nich może zawierać niekończące się średniki, które należy zignorować):

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();
}

Edytuj 15.08.2017: Naprawiono błąd w wielowierszowej części komentarza wyrażenia regularnego wskazany przez @jxmallett.Edytuj 2016-08-16: Uporządkowane regex (dodano regex shebang i usunięto niepotrzebną grupę $2 ).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL — funkcja FOUND_ROWS() dla całkowitej liczby wierszy, których dotyczy problem

  2. Skrypt wsadowy systemu Windows do tworzenia kopii zapasowych lokalnych baz danych MySQL i zachowywania tylko N najnowszych FOLDERÓW z plikami kopii zapasowej

  3. Jak mogę sprawdzić dwa warunki przed wstawieniem?

  4. Zapobieganie wstrzykiwaniu MySQL

  5. Jak wyeksportować zapytanie SQL do TXT za pomocą wiersza poleceń