SQL Server 용 SQL 구문 분석 프로그램을 만들고 SQL 시각화에 도전하는 이야기



이것은 Azure SQL & Synapse Analytics Advent Calendar 2020 13 일째 기사입니다.

구문 분석 프로그램을 만들었습니다.



산만큼 있는 SQL로부터 데이터의 흐름을 쫓고 싶었으므로, SQL의 구문 분석 프로그램을 만들었습니다.

Microsoft의 Microsoft SQL Server 2016 서비스 팩 2 Feature Pack 에 들어 있는 Microsoft SQL Server 2016 SP2 Transact-SQL ScriptDom을 사용해 작성했으므로, SQL Server용입니다.
최신 SQL Server 2019에서만 사용할 수 있는 구문에는 대응하고 있지 않습니다만, Microsoft제의 구문 분석 라이브러리를 사용하고 있으므로 그 이외의 구문에는 거의 대응하고 있습니다.

여담입니다만...처음에는 개인 버전의 SQL ISO 표준 구문 정의 무너진 것을 계기로 포기했습니다.
다음은 ANTLR 커뮤니티가 만든 TSQL 구문 정의 를 바탕으로 만드는 것을 시도했습니다.
동작하는 곳까지는 가지고 갔습니다만, 원래의 구문 정의에 결함이 많아 아무리 수정해도 탄에 물이었으므로 일단 단념했습니다.
htps : // 기주 b. 코 m / G 세 r 히데 노리 / AN TSQL 파 r r

Graphviz에서 SQL 시각화에 도전 중입니다.



이 구문 분석 프로그램을 사용한 알기 쉬운 응용 예가 없을까 생각하고, Graphviz에서의 SQL의 가시화를 생각해 냈습니다.

작성한 SQL 구문 분석 프로그램은 XML을 출력하므로, 이것을 Graphviz의 dot로 변환해 가시화합니다.
아직 제작이지만 SQL에서 다음과 같은 이미지를 만들 수 있습니다.
  • UPDATE


  • USE AdventureWorks2016;
    GO 
    UPDATE Production.Product
    SET ListPrice = ListPrice * 2
    FROM Production.Product AS p
    INNER JOIN Purchasing.ProductVendor AS pv
        ON p.ProductID = pv.ProductID AND BusinessEntityID = 1540;
    GO   
    
    -- Query data/Subqueries
    -- https://docs.microsoft.com/en-us/sql/relational-databases/performance/subqueries?view=sql-server-ver15
    
    
  • 부문의


  • USE AdventureWorks2016;
    GO
    
    /* SELECT statement built using a subquery. */
    SELECT Name
    FROM Production.Product
    WHERE ListPrice =
        (SELECT ListPrice
         FROM Production.Product
         WHERE Name = 'Chainring Bolts' );
    GO
    
    /* SELECT statement built using a join that returns
       the same result set. */
    SELECT Prd1. Name
    FROM Production.Product AS Prd1
         JOIN Production.Product AS Prd2
           ON (Prd1.ListPrice = Prd2.ListPrice)
    WHERE Prd2. Name = 'Chainring Bolts';
    GO
    
    -- Query data/Subqueries
    -- https://docs.microsoft.com/en-us/sql/relational-databases/performance/subqueries?view=sql-server-ver15
    
  • CREATE VIEW


  • CREATE VIEW hiredate_view  
    AS   
    SELECT p.FirstName, p.LastName, e.BusinessEntityID, e.HireDate  
    FROM HumanResources.Employee e   
    JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ;  
    GO  
    
    
    -- Reference/Transact-SQL (T-SQL) Reference/Statements/CREATE/VIEW
    -- https://docs.microsoft.com/en-us/sql/t-sql/statements/create-view-transact-sql?view=sql-server-ver15
    

    사용법


  • 프로그래밍 방식으로 SQL에서 구문 정보를 XML로 출력합니다.sqlparser -o xml -i -f <SQLファイルパス> -u <XMLファイルパス>
  • XML 파일을 graphviz의 dot 파일로 변환ruby proofofconcept2.rb -x <XMLファイルパス> > <dotファイルパス>
  • graphviz에서 dot 파일에서 이미지 (png 파일)를 만듭니다.dot -T png <dotファイルパス> -o <pngファイルパス>

  • sqlparser는 TSQLScriptDomParser
    proofofconcept2는 SQLVisualize에서 구할 수 있습니다.

    sqlparser의 사용법은 여기 이나, 여기 를 봐 주세요.

    좋은 웹페이지 즐겨찾기