Разбор существующих «сложных» операторов SQL и преобразование в вызовы для пользовательских вызовов API - PullRequest
1 голос
/ 09 марта 2011

У меня есть ситуация, когда у меня есть несколько сотен сложных таблиц Excel, каждая из которых имеет несколько сводных таблиц, выполняющих запросы к базе данных SQL.Мне нужно быть в состоянии преобразовать эти запросы SQL в вызовы функций против собственного хранилища данных.Это сложно на многих уровнях, но часть, о которой я сейчас спрашиваю, и, кажется, вероятно, была рассмотрена ранее в информатике, это как «разобрать» операторы sql в четко определенную структуру, с которой я могу работать программно.

Пример моей начальной точки:

SELECT vwFlowDataBest.MeasurementDate, vwFlowDataBest.LocationType, vwFlowDataBest.ScheduledVolume, tblPoints.Zone, tblPoints.Name AS SOME_ALIAS_FOR_NAME, vwFlowDataBest.PointID, tblCustomerType.Name, vwFlowDataBest.OperationallyAvailable, tblPoints.County, tblPoints.State, tblConnectingParty.Name

FROM Pipe2Pipe.dbo.tblConnectingParty tblConnectingParty, Pipe2Pipe.dbo.tblCustomerType tblCustomerType, Pipe2Pipe.dbo.tblPipelines tblPipelines, Pipe2Pipe.dbo.tblPoints tblPoints, Pipe2Pipe.dbo.vwFlowDataBest vwFlowDataBest

WHERE tblCustomerType.ID = tblPoints.CustomerTypeID AND tblPipelines.ID = vwFlowDataBest.PipelineID AND tblPoints.ID = vwFlowDataBest.PointID AND tblPoints.ConnectingPartyID = tblConnectingParty.ID AND ((tblPipelines.ID=16) AND (vwFlowDataBest.ScheduledVolume<>0) AND (tblPoints.Zone In ('mid 1','mid 2','mid 3','mid 4','mid 5','mid 6','mid 7')) AND (tblCustomerType.ID=16) AND (vwFlowDataBest.MeasurementDate>={ts '2010-05-15 00:00:00'}) AND (tblPipelines.ID<155))

Итак, для этого утверждения мне нужно программно обработать часть SELECT, часть FROM и часть WHERE, а также подчиненные в каждом.Осложнения этого - такие вещи, как псевдонимы, различие между объединением таблиц и фильтром простого старого значения в предложении where, группированием (скобками) в предложении where и другими проблемами.Разобраться со сложностями сводных таблиц Excel совершенно не входит в сферу этого вопроса, я могу это понять.

Пока я не против не поддержки определенных функций SQL, таких каккак "группировка по", "наличие" и т. д. для моей проблемы, они достаточно малы, чтобы при необходимости я мог обработать их вручную.Но если есть известный способ справиться с этим, я был бы очень счастлив.

Мне кажется, что я могу, вероятно, получить 70% пути (для моей проблемы), просто разделив выражение sqlна 3 части, а затем разбить каждую из них на логические подчиненные части, а затем разобраться с ними соответствующим образом.Но когда я пишу это, я уже вижу дыры в моем плане ... это похоже на остроту сложности и крайних случаев.

Я не могу себе представить, что я первый человек, который хочет сделать такоеВопрос в том, есть ли старые, проверенные подходы к решению этой проблемы, существующие библиотеки, инновационные подходы, которые я мог бы использовать, или какие-либо общие предложения для решения этой задачи?

1 Ответ

3 голосов
/ 09 марта 2011

Кажется, вам нужен анализатор SQL (или хотя бы его часть).Это может быть излишним для ваших целей (более полным, чем вам нужно), но есть PL / SQL-анализатор для ANTLR , который может быть полезен.

Редактировать: Iна самом деле не читал эту грамматику так тщательно, как следовало бы, прежде чем я разместил ссылкуНемного посмотрев, он на самом деле вообще не анализирует операторы выбора - он просто распознает, где он находится, и пропускает его.

Страница грамматик ANTLR содержит еще несколько SQLХотя грамматики (для вариантов, поддерживаемых / используемых MySQL, Oracle и т. д.) Поскольку у вас есть C # и тому подобное в тегах, вероятно, будет справедливо предположить, что вы хотите проанализировать вариант MS SQL Server.Существует грамматика строго для его select утверждения, которое может быть разумным образом соответствует вашим потребностям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...