Thuật toán hình thành mã SQL


11

Tôi cần một công cụ (để sử dụng trong nhà) sẽ định dạng mã SQL (SQL Server / MySQL).
Có nhiều công cụ của bên thứ 3 và các trang web trực tuyến thực hiện việc đó nhưng không biết chính xác tôi cần nó như thế nào.

Vì vậy, tôi muốn viết công cụ của riêng tôi sẽ phù hợp với nhu cầu của tôi.

Câu hỏi đầu tiên là có bất kỳ tiêu chuẩn hoặc quy ước nào về cách định dạng mã SQL không? (các công cụ mà tôi đã thử định dạng nó khác nhau)

Câu hỏi thứ hai, tôi nên tiếp cận nhiệm vụ này như thế nào? Đầu tiên nên chuyển đổi truy vấn sql thành một số cấu trúc dữ liệu như Cây?

Câu trả lời:


2

... Có bất kỳ tiêu chuẩn hoặc quy ước nào về cách định dạng mã SQL không?

Tiêu chuẩn, không. Bạn có thể đặt toàn bộ câu lệnh SQL trên một dòng liên quan đến trình phân tích cú pháp SQL.

Công ước, chắc chắn có rất nhiều. Nó phụ thuộc vào việc bạn đang cố gắng tối đa hóa khả năng thay đổi hay tối thiểu hóa không gian. Tôi đã viết các trình định dạng SQL cho cả hai trường hợp.

Tôi chỉ sử dụng các kết hợp ký tự cụ thể để cho tôi biết nơi để phá vỡ câu lệnh SQL.

Đây là một ví dụ từ một trình định dạng SQL Java Java mà tôi đã viết. Một chương trình Java khác đã tạo mã Java. SQL đến trực tiếp từ các SYSIBMbảng.

protected void prepareIndex00Select(String codeFacl)
        throws SQLException {
    StringBuffer sb = new StringBuffer();
    sb.append("SELECT CODE_FACL, SEQ_FACL, FILLER_TOF ");
    sb.append("    , CODE_TOF, NAME_FACL, NAME_LENGTH ");
    sb.append("    , CODE_FMB, ID_NCIC_ORI, NBR_PRINTER_PREFIX ");
    sb.append("    , ID_PERSONNEL_OFC, COMPLEX_CODE ");
    sb.append("    , PHS_CODE, DESIG_FACL_GRP, IND_DESIG_AUTH ");
    sb.append("    , CODE_FACL_I_T, INTKEY_FACL, IND_CDM_SENTENCING ");
    sb.append("    , MAL_FEM_IND, DEL_AFTER, IND_INMATES ");
    sb.append("    , VALUE_SO_CPU_STD, VALUE_SO_CPU_DAY ");
    sb.append("    , CODE_CAT, VALUE_DCN, XIDBKEY ");
    sb.append("    , FACL_FK_REGN ");
    sb.append("  FROM ");
    sb.append(creator);
    sb.append(".FACL ");
    sb.append("  WHERE CODE_FACL = ? ");
    if (additionalSQL != null) sb.append(additionalSQL);

    psIndex00 = connection.prepareStatement(sb.toString());
    psIndex00.setString(1, codeFacl);

}   // End prepareIndex00Select method

Sản phẩm của bạn (bộ định dạng) có sẵn trực tuyến hoặc để tải xuống?
jullins

@jullins: Không. Tôi đã viết nó chỉ để chứng minh rằng tôi có thể viết một ứng dụng Java viết các lớp Java, cũng như xây dựng SQL từ cột cơ sở dữ liệu và các bảng chỉ mục (SYSIBM). Đáng buồn thay, không ai tôi làm việc cùng đã tìm thấy nó hữu ích. Tôi cho rằng tôi có thể đặt mã ở đâu đó nếu bạn muốn.
Gilbert Le Blanc

Tôi sẽ đánh giá cao nó, tôi chỉ muốn xem phần định dạng.
jullins

@jullins: Bây giờ tôi đang làm việc, vì vậy tôi không thể truy cập các kho lưu trữ công cộng. Tôi sẽ đặt mã lên đâu đó vào cuối tuần này và cho bạn biết cách truy cập nó.
Gilbert Le Blanc

Còn mã thì sao? Bạn có thể đặt nó ở đâu đó không?
jullins

2

Một chút muộn màng, chỉ vấp phải điều này, xin lỗi.

Trình định dạng T-SQL của Poor Man là một trình định dạng T-SQL mã nguồn mở (thư viện, plugin ssms, trình định dạng tệp dòng lệnh, v.v.) - việc triển khai có tính mô đun hợp lý và không khó để thực hiện trình tạo mã thông báo và trình định dạng MySQL để phù hợp với các T-SQL (tôi chưa thực hiện chủ yếu vì tôi không có kinh nghiệm hoặc sử dụng cho MySQL ngay bây giờ, vì vậy đây không phải là cách sử dụng tốt thời gian của tôi).

Thư viện được triển khai trong C # (2.0) với giấy phép AGPL - điều đó có nghĩa là bạn không thể phân phối lại thương mại hoặc trưng bày dưới dạng dịch vụ công cộng mà không xuất bản bất kỳ sửa đổi nào, nhưng đối với người dùng nội bộ thì sẽ không có vấn đề gì, dù là tùy chỉnh hay không phải.

Như @Gilbert Le Blank đã trả lời, chắc chắn không có tiêu chuẩn nào về định dạng SQL - ngay cả các trình định dạng thương mại ngoài kia, với các tùy chọn khác nhau mà chúng cung cấp, không hội tụ cùng một mặc định hoặc thậm chí nhất thiết phải hỗ trợ các định dạng đầu ra giống nhau.

Đối với việc viết công cụ của riêng bạn từ đầu, tôi sẽ khuyên bạn nên xử lý nó nếu bạn cần xử lý nhiều trường hợp khác nhau: ít nhất là đối với T-SQL, xử lý các lô đa câu lệnh SQL bằng CTE VỚI mệnh đề, câu lệnh MERGE, truy vấn phụ và bảng dẫn xuất, vv hóa ra là khá khó :)

Trong trường hợp đó là bất kỳ trợ giúp: http://www.architectshack.com/PoorMansTSqlFormatter.ashx

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.