Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Tách các truy vấn mysql trong mảng, mỗi truy vấn cách nhau bởi;

Đưa ra một chuỗi chứa nhiều câu lệnh SQL được phân tách bằng dấu chấm phẩy, hàm sau sẽ phân tích cú pháp từng câu lệnh riêng lẻ và trả về tất cả chúng trong một mảng. Nó sử dụng một regex (không tầm thường) và một lệnh gọi tới preg_match_all() và xử lý chính xác các nhận xét đơn và nhiều dòng cũng như các chuỗi được trích dẫn đơn và kép, (mỗi chuỗi có thể chứa dấu chấm phẩy không kết thúc sẽ bị bỏ qua):

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

Chỉnh sửa ngày 8 tháng 8 năm 2017: Đã sửa lỗi trong phần nhận xét nhiều dòng của regex được chỉ ra bởi @jxmallett. Chỉnh sửa 2017-08-16: Tidied regex (đã thêm regex shebang và xóa nhóm không cần thiết $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. Tập lệnh PHP (mysqli) không echo là gì?

  2. Mysql - trong đó mệnh đề chậm hơn quét toàn bộ

  3. Kỹ thuật chuyển tiếp MySQL Workbench Lỗi 1064

  4. 'LIKE ('% this% 'OR'% that% ') và cái gì đó =else' không hoạt động

  5. Tôi muốn bảng mysql hỗ trợ hai ngôn ngữ