SQL 코드 형식화 알고리즘


11

SQL 코드 (SQL Server / MySQL)를 형식화하는 도구 (사내 사용)가 필요합니다.
다양한 타사 도구와 온라인 웹 사이트가 있지만 정확히 어떻게 작동하지는 않습니다.

그래서 내 필요에 맞는 도구를 직접 작성하고 싶습니다.

첫 번째 질문은 SQL 코드의 형식을 지정하는 방법에 대한 표준 또는 규칙이 있습니까? (내가 시도한 도구는 다르게 포맷합니다)

두 번째 질문은 어떻게해야합니까? 처음에는 SQL 쿼리를 Tree와 같은 데이터 구조로 변환해야합니까?

답변:


2

... SQL 코드의 형식을 지정하는 방법에 대한 표준 또는 규칙이 있습니까?

표준. SQL 파서에 관한 한 전체 SQL 문을 한 줄에 넣을 수 있습니다.

컨벤션에는 많은 것이 있습니다. 변경 가능성을 최대화하거나 공간을 최소화 하려는지 여부에 따라 다릅니다. 두 경우 모두 SQL 포맷터를 작성했습니다.

방금 특정 문자 조합을 사용하여 SQL 문을 중단 할 위치를 알려줍니다.

다음 은 내가 작성한 Java DB2 SQL 포맷터의 예 입니다. 다른 Java 프로그램이 Java 코드를 생성했습니다. SQL은 SYSIBM테이블 에서 직접 가져 왔습니다 .

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

제품 (포맷터)을 온라인이나 다운로드 할 수 있습니까?
jullins

@jullins : 아니요. 데이터베이스 열 및 인덱스 테이블 (SYSIBM)에서 SQL을 작성하는 것뿐만 아니라 Java 클래스를 작성하는 Java 응용 프로그램을 작성할 수 있음을 증명하기 위해 작성했습니다. 슬프게도, 내가 작업하는 사람은 아무도 유용하지 않다. 원하는 경우 코드를 어딘가에 넣을 수 있다고 가정합니다.
길버트 르 블랑

고맙게 생각합니다. 포맷 부분을보고 싶습니다.
jullins

@jullins : 나는 현재 직장에 있으므로 공개 저장소에 액세스 할 수 없습니다. 이번 주말에 코드를 작성하고 액세스 방법을 알려 드리겠습니다.
길버트 르 블랑

코드는 어떻습니까? 어딘가에 넣을 수 있습니까?
jullins

2

조금 늦었고, 단지 이것을 우연히 발견했습니다. 죄송합니다.

Poor Man의 T-SQL 포맷터는 오픈 소스 T-SQL 포맷터 (라이브러리, ssms 플러그인, 명령 줄 파일 포맷터 등)입니다. 구현은 상당히 모듈 식이므로 MySQL 토크 나이저 및 포맷터를 구현하기가 어렵지 않아야합니다. T-SQL과 일치시키기 위해 (현재 MySQL에 대한 경험이나 사용 경험이 없기 때문에 주로하지 않았으므로 내 시간을 잘 사용하지 못합니다).

라이브러리는 AGPL 라이센스와 함께 C # (2.0)으로 구현됩니다. 즉, 수정없이 게시하지 않고 상업적으로 재배포하거나 공용 서비스로 공개 할 수는 없지만 사내 사용자의 경우 사용자 지정 여부에 관계없이 문제가 발생하지 않습니다. 아니.

@Gilbert Le Blank가 이미 대답했듯이 SQL 형식에 대한 표준은 없습니다. 상용 형식 기조차도 제공하는 다른 옵션이 동일하거나 동일한 기본값으로 수렴하지 않거나 반드시 동일한 출력 형식을 지원하지 않습니다.

자신의 도구를 처음부터 작성하는 것과 관련하여 적어도 T-SQL의 경우, CTE WITH 절, MERGE 문, 하위 쿼리 및 SQL 멀티 문 배치를 처리하는 등 다양한 경우를 처리 해야하는 경우 도구에 대해 조언합니다. 파생 테이블 등은 꽤 어렵습니다. :)

도움이되는 경우 : http://www.architectshack.com/PoorMansTSqlFormatter.ashx

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.