Существует ли стандартная XML-кодировка запросов для SQL? - PullRequest
2 голосов
/ 05 мая 2009

Существует ли стандартный способ кодирования запросов SQL в XML? Я имею в виду что-то вроде

select name from users where name like 'P%' group by name order by name desc

может кодироваться как (мой 5-минутный макет, вероятно, катушки) ...

<?xml version="1.0" encoding="UTF-8"?>
<query>
    <select>
        <table name="users">
            <column name="name"/>
        </table>
    </select>
    <from>
        <table name="users"/>
    </from>
    <where>
        <operator name="like">
            <column name="name"/>
            <value>P%</value>
        </operator>
    </where>
    <aggregation>
        <groupby>
            <column name="name"/>
        </groupby>
    </aggregation>
    <order>
        <order-by>
            <column name="name" order="desc"/>
        </order-by>
    </order>
</query>

... что позволит легко создавать, хранить, проверять структуру и контент (путем создания схемы на основе схемы базы данных) и т. Д.

Ответы [ 5 ]

5 голосов
/ 05 мая 2009

Я не знаю ни одного такого стандарта. То, что у вас есть, выглядит вполне выполнимо. Я спрашиваю, почему вы хотите сделать это, хотя. Я думаю, что это внутренняя платформа (анти-шаблон). Кроме того, он специально переизобретает SQL, который является хорошо известным примером этого анти-паттерна. В довершение всего, это программирование на XML, что широко считается плохой идеей.

Грамматика SQL достаточно проста, так что вы, вероятно, сможете создать для нее парсер в короткие сроки, используя обычные инструменты генератора парсеров (вероятно, в Интернете уже есть некоторые с открытым исходным кодом). Это было бы намного более чистым способом проверки вашего синтаксиса SQL.

2 голосов
/ 06 мая 2009

Я пытался сделать то же самое.

Чтобы ответить на вопрос в комментариях о том, почему я хотел бы. Ну, я хочу определить базовый запрос с набором доступных столбцов и условий фильтрации, а также разрешить пользователю выбирать столбцы, которые он хочет отображать, а также включать и отключать определенные выражения в предложении where.

Я поиграл с несколькими вариантами XML-схемы и получил несколько приличных результатов. Мне даже удалось применить XSLT для извлечения текста SQL на основе предпочтений пользователей.

Я также искал парсеры SQL. http://www.sqlparser.com имеет один, но коммерческий, и его API в значительной степени стилизован под Delphi и, на мой взгляд, не очень доступен.

Как уже говорили другие, возможно использовать что-то вроде ANTLR для генерации кода C #, который будет анализировать SQL. Вы можете найти несколько грамматик SQL здесь . Самая последняя из перечисленных здесь грамматик MS SQL - MS SQL 2000. У меня не было времени поиграться с этим.

Я надеялся, что в SDK Oslo будет приличный M Grammer, который сможет анализировать запросы, но я пока не нашел.

1 голос
/ 06 мая 2009

XQuery - это язык запросов XML, который поддерживает некоторые из тех же идей, что и SQL. Это не взаимно понятные языки, но если вы знакомы с SQL, у вас не должно быть слишком много проблем с XQuery.

Насколько я знаю, существует только одна реалистичная реализация XQuery, Существуют .

Я не использовал ни одну из этих технологий ни для чего, кроме общего исследовательского интереса.

1 голос
/ 05 мая 2009

Там не совсем стандарт. Вероятно, вы не должны делать то, что вы собираетесь делать. Но если бы я собирался, я бы посмотрел на один из: (1) Убить некоторые конструкции из плана XML-запросов. XSD для установки SQL 2005 по умолчанию находится в C: \ Program Files \ Microsoft SQL Server \ 90 \ Tools \ Binn \ schemas \ sqlserver \ 2004 \ 07 \ showplan \ showplanxml.xsd

(2) Sql 2008 поставляется с intellisense в IDE, и, похоже, он реализует это с помощью этой сборки .net - C: \ Program Files \ Microsoft SQL Server \ 100 \ Tools \ Binn \ VSShell \ Common7 \ IDE \ Microsoft.SqlServer.SqlParser.dll Если вы добавите ссылку на эту сборку, вы сможете проанализировать исходный сценарий и извлечь определение xml, которое предоставляет сборка анализатора. Э.Г.

SqlScript script = Parser.Parse(strSqlScript);
foreach (SqlBatch batch in script.Batches)
{
  foreach (SqlStatement s in batch.Statements)
  {
    Console.Write(s.Xml);
  }
}

Вы можете обнаружить, что данное определение xml может быть повторно использовано для ваших нужд.

0 голосов
/ 26 ноября 2012

Ну, я сам обдумывал это, пытаясь вспомнить, как это делается для CRM, который динамически создает таблицы при определении сущностей.

Тогда я наконец наткнулся на правильное имя "fetchXML" несколько минут назад

http://msdn.microsoft.com/en-us/library/gg328117.aspx

Конечно, это собственность MS, но, по крайней мере, вы можете быть уверены, что они рассмотрели любой вероятный сценарий.

...