我想你不想寫一個解析器來管理Jet SQL和T-SQL之間的翻譯......
我們開發的解決方案(是的,我們遇到類似的問題需要解決)是定義一些我們在meta-SQL語法中使用的'僞元語言',並且我們有一種這種元語言的翻譯器轉換爲Jet SQL或T-SQL。
例子:
myQuery = "SELECT @[email protected]([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 @[email protected]@[email protected]@[email protected]"
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%""
我konw這不是很好,但它是相當高效和清潔。要點如下:
- 我們不是在Jet和T-SQL之間進行翻譯,而是從'元語法'進行翻譯。它使事情變得更容易
- 當函數沒有相同數量的參數或參數未按相同順序傳遞時,應該非常小心。它仍然可以做...
- 我們的元語法依賴於相應的字符串(比如'@ MyWildCard @'或'@ CarSep @')是特定於我們的語法的事實,並且不能用作數據值(否則我們將不得不管理一些'元注入'風險!...)
的'金額= 0'部分將不訪問工作。它應該是'0 AS Amount'。 –
我去了這個解決方案的變種。我的直接需求是執行一個INSERT。 。 。選擇。 。我只是簡單地重複這個語句兩次,一次是NULL,一次是其他行。 –