И я думаю, вы не хотите писать парсер, который будет управлять переводами между Jet SQL и T-SQL ...
Решение, которое мы разработали (да, у нас была похожая проблема, которую нужно решить)состоит в том, чтобы определить некоторый «псевдо-метаязык», который мы используем в нашем синтаксисе мета-SQL, и у нас есть своего рода переводчик с этого мета-языка в Jet SQL или T-SQL.
Пример:
myQuery = "SELECT @MyCoalesceFunction@([Amount], 0) FROM PaymentsDue;"
myQuery = convertFromMeta(myQuery,"T-SQL")
will give
"SELECT COALESCE([Amount], 0) FROM PaymentsDue;"
myQuery = convertFromMeta(myQuery,"JET-SQL")
will give
"SELECT NZ([Amount], 0) FROM PaymentsDue;"
Та же стратегия может быть использована для подстановочных знаков и разделителей:
myQuery = "SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE @CarSep@ABC@MyWildCard@@CarSep@"
myQuery = convertFromMeta(myQuery,"T-SQL")
will give
"SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE 'ABC%'"
myQuery = convertFromMeta(myQuery,"JET-SQL")
will give
"SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE "ABC%""
Я знаю, что это не так хорошо, но это довольно эффективно ичистый.Основные моменты:
- Мы не переводим между Jet и T-SQL, а используем мета-синтаксис.Это намного упрощает
- Следует быть очень осторожным, когда функции не имеют одинаковое количество параметров или когда параметры не передаются в одном и том же порядке.Это все еще можно сделать ...
- Наш метасинтаксис основан на том факте, что соответствующие строки (например, '@ MyWildCard @' или '@ CarSep @') являются специфическими для нашего синтаксиса и не могут использоватьсяв качестве значений данных (в противном случае нам пришлось бы управлять некоторыми рисками мета-инъекций! ...)