【问题标题】:API or tools to convert SQL (SELECT queries) into XML FORM将 SQL(SELECT 查询)转换为 XML FORM 的 API 或工具
【发布时间】:2011-07-04 09:47:13
【问题描述】:

需要帮助将 SQL 查询转换为某种标准 XML 格式。

例如,假设我有一个查询“SELECT A, B, C FROM XYZ WHERE B = C AND A > 2”

我应该得到结果

<QUERY>
<SELECT>
    <COLUMNS>
        <COLUMN>A</COLUMN>
        <COLUMN>B</COLUMN>
        <COLUMN>B</COLUMN>
    </COLUMNS>
</SELECT>
<FROM>
    <TABLES>
    </TABLES>
</FROM>
<WHERE>
    <CONDITIONS>
        <AND>
            <CONDITION>
                <EQUALS>
                <VARIABLE>B</VARIABLE>
                <VARIABLE>C</VARIABLE>
                </EQUALS>
            </CONDITION>
            <CONDITION>
                <GREATER>
                <VARIABLE>A</VARIABLE>
                <VARIABLE>2</VARIABLE>
                </GREATER>
            </CONDITION>
        </AND>
    </CONDITIONS>
</WHERE>
</QUERY>

请向我推荐一些可以提供此 XML 结果的 API 或工具。

【问题讨论】:

  • 我猜你必须自己做。
  • 为复杂查询编写SQL2XML转换器会很复杂,有一些功能
  • @Jayachandran,你为什么要这么做?如果您想做一些事情,比如将 XML 发送到服务器,将其转换回 SQL 并执行该 SQL,为什么不直接发送 SQL?
  • 我实际上打算在不久的将来为jooq.org 实现类似的东西。不过,这不是一个高优先级。你需要它做什么?
  • 我正在尝试创建一个数据迁移工具,它将所有 DDL 信息从报告工具中提取到另一种类型的报告工具中。其中一个报表服务器将输入作为 SQL 查询,另一个将输入作为 XML 数据。所以要执行此操作,我需要这个 SQL2XML 转换器 API。

标签: sql xml


【解决方案1】:

这看起来很有趣。虽然我的回复晚了,但我尝试了以下方法,看看我是否可以接近想出一种方法来做到这一点。它需要更多的工作,但我相信通过使用这种格式,您可以提出一个可行的解决方案。

    SET NOCOUNT ON

    ------------------------------------------------------------------------------
    ----------- DECLARE VARIABLES AND TABLES -------------------------------------
    ------------------------------------------------------------------------------
    DECLARE @QueryID                  INT
    DECLARE @SelectID                 INT
    DECLARE @ColumnsBeginID           INT
    DECLARE @ColumnsEndID             INT
    DECLARE @FromID                   INT
    DECLARE @TablesBeginID            INT
    DECLARE @TablesEndID              INT
    DECLARE @WhereID                  INT
    DECLARE @ConditionsBeginID        INT
    DECLARE @ConditionsEndID          INT

    DECLARE @XMLQuery                 XML = '<QUERY></QUERY>'


    DECLARE @Query TABLE
    (
          QueryID                     INT             NOT NULL    IDENTITY (1,1)   PRIMARY KEY
        , [SELECT]                    INT             NOT NULL    
        , [FROM]                      INT             NOT NULL    
        , [WHERE]                     INT                 NULL      
    )

    DECLARE @Select TABLE
    (
          SelectID                    INT             NOT NULL    IDENTITY (1,1)   PRIMARY KEY
        , [COLUMNS_BEGIN]             INT             NOT NULL    
        , [COLUMNS_END]               INT             NOT NULL    
    )

    DECLARE @Column TABLE
    (
          ColumnID                    INT             NOT NULL    IDENTITY (1,1)   PRIMARY KEY
        , [Column]                    SYSNAME         NOT NULL
        , [TableAlias]                SYSNAME         NOT NULL
        , [ColumnAlias]               SYSNAME         NOT NULL
    )

    DECLARE @From TABLE
    (
          FromID                      INT             NOT NULL    IDENTITY (1,1)   PRIMARY KEY
        , [TABLES_BEGIN]              INT             NOT NULL    
        , [TABLES_END]                INT             NOT NULL    
    )

    DECLARE @Table TABLE
    (
          TableID                      INT             NOT NULL    IDENTITY (1,1)   PRIMARY KEY
        , [Join]                       SYSNAME         NOT NULL    
        , [Tablename]                  SYSNAME         NOT NULL    
        , [TableAlias]                 SYSNAME         NOT NULL    
        , [On]                         SYSNAME         NOT NULL    
    )

    DECLARE @Where TABLE
    (
          WhereID                     INT             NOT NULL    IDENTITY (1,1)   PRIMARY KEY
        , [CONDITIONS_BEGIN]          INT             NOT NULL    
        , [CONDITIONS_END]            INT             NOT NULL    
    )

    DECLARE @Condition TABLE
    (
          ConditionID                 INT             NOT NULL    IDENTITY (1,1)   PRIMARY KEY
        , [AndOr]                     SYSNAME         NOT NULL    
        , [Equality]                  SYSNAME         NOT NULL
        , [Variable1]                 SYSNAME         NOT NULL    
        , [Variable2]                 SYSNAME         NOT NULL    
    )

    ------------------------------------------------------------------------------
    ----------- USERS QUERY HERE -------------------------------------------------
    ------------------------------------------------------------------------------

    --SELECT A, B, C FROM XYZ WHERE B = C AND A > 2

    INSERT INTO @Column ([Column], [TableAlias], [ColumnAlias]) VALUES ('A', 'x', 'a')
    SET @ColumnsBeginID = @@IDENTITY 
    INSERT INTO @Column ([Column], [TableAlias], [ColumnAlias]) VALUES ('B', 'x', 'b')
    INSERT INTO @Column ([Column], [TableAlias], [ColumnAlias]) VALUES ('C', 'x', 'c')
    SET @ColumnsEndID = @@IDENTITY 

    INSERT INTO @Select ([COLUMNS_BEGIN], [COLUMNS_END]) VALUES (@ColumnsBeginID, @ColumnsEndID)
    SET @SelectID = @@IDENTITY


    INSERT INTO @Table ([Join], [Tablename], [TableAlias], [On]) VALUES ('FROM', 'XYZ', 'x', '')
    SET @TablesBeginID = @@IDENTITY
    SET @TablesEndID = @TablesBeginID

    INSERT INTO @From ([TABLES_BEGIN], [TABLES_END]) VALUES (@TablesBeginID, @TablesEndID)
    SET @FromID = @@IDENTITY


    INSERT INTO @Condition ([AndOr], [Equality], [Variable1], [Variable2]) VALUES ('AND','EQUALS','B','C')
    SET @ConditionsBeginID = @@IDENTITY
    INSERT INTO @Condition ([AndOr], [Equality], [Variable1], [Variable2]) VALUES ('AND','GREATER','A','2')
    SET @ConditionsEndID = @@IDENTITY

    INSERT INTO @Where ([CONDITIONS_BEGIN], [CONDITIONS_END]) VALUES (@ConditionsBeginID, @ConditionsEndID)
    SET @WhereID = @@IDENTITY


    INSERT INTO @Query ([SELECT], [FROM], [WHERE]) VALUES (@SelectID, @FromID, @WhereID)


    ------------------------------------------------------------------------------ 
    ----------- BUILD THE @XMLQuery VARIABLE ------------------------------------- 
    ------------------------------------------------------------------------------ 

    SET @XMLQuery = (SELECT SelectColumn            = c.[Column]
                          , SelectColumnTableAlias  = c.[TableAlias]
                          , SelectColumnColumnAlias = c.[ColumnAlias]

                          , FromTableJoin           = t.[Join]
                          , FromTable               = t.[Tablename]
                          , FromTableAlias          = t.[TableAlias]
                          , FromOn                  = t.[On]

                          , WhereConditionAndOr     = n.[AndOr]     
                          , WhereConditionEquaility = n.[Equality]  
                          , WhereConditionVariable1 = n.[Variable1] 
                          , WhereConditionVariable2 = n.[Variable2] 

                       FROM  @Query     q
                       JOIN  @Select    s  ON s.SelectID    = q.[SELECT]
                       JOIN  @From      f  ON f.FromID      = q.[FROM]
                       JOIN  @Where     w  ON w.WhereID     = q.[WHERE]
                       JOIN  @Column    c  ON c.ColumnID    BETWEEN s.[COLUMNS_BEGIN]    AND s.[COLUMNS_END]
                       JOIN  @Table     t  ON t.TableID     BETWEEN f.[TABLES_BEGIN]     AND f.[TABLES_END]
                       JOIN  @Condition n  ON n.ConditionID BETWEEN w.[CONDITIONS_BEGIN] AND w.[CONDITIONS_END]

                   ORDER BY c.ColumnID
                          , t.TableID
                          , n.ConditionID
                        FOR XML AUTO, ROOT ('QUERY') 
                        --FOR XML RAW, ROOT ('QUERY') 
                        --FOR XML PATH, ROOT ('QUERY') 
                      )

    SELECT @XMLQuery

【讨论】:

  • 抱歉回复延迟...谢谢格雷格!通过 SQL 管理转换的非常有趣的解决方案。我正在通过 java 代码转换 SQL2XML。感谢您花时间回答问题。
【解决方案2】:

【讨论】:

  • 您介意使用该链接的相关部分扩展该答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-16
  • 2014-06-01
  • 2016-11-25
  • 2018-09-23
  • 1970-01-01
  • 2015-06-02
相关资源
最近更新 更多