Как получить список столбцов из запроса? - PullRequest
0 голосов
/ 09 января 2019

Окно данных PowerBuilder имеет некоторые параметры, и эти параметры явно соответствуют столбцам в запросе окна данных. Запрос слишком сложный. В моем скрипте я получаю синтаксис запроса в виде строковой переменной. Также я получаю список параметров, определенных в окне данных. Теперь я хочу получить список столбцов из синтаксиса запроса, где столбцы сравниваются с аргументами поиска. Мне не нужны те столбцы, где столбец не сравнивается с поисковым аргументом.

например, строка запроса имеет в своем тексте "product_price> =: prod_price AND ИД поставщика является нулевым И store_id =: storeID"

Я хочу получить имена всех столбцов, кроме поставщика, потому что идентификатор поставщика не сравнивается ни с одним аргументом поиска. Запрос слишком сложен со многими инструкциями и операторами.

Есть ли какой-нибудь простой способ получить список столбцов из строки запроса без использования сложного сценария синтаксического анализа строки?

1 Ответ

0 голосов
/ 06 февраля 2019

Один из способов облегчить вашу проблему - не использовать параметры.

Вместо

select col1, col2, col3 from table where id = :id

попробовать

select col1, col2, col3 from table where 1 = 2

В вашем коде вы можете найти и заменить 1 = 2 на id = 8675309

Пример

long ll_id = 8675309
long ll_start_pos
string ls_needle
string ls_replace
string ls_sql

ls_sql = dw_products.Getsqlselect()
//ls_sql = select col1, col2, col3 from table where 1 = 2

ls_needle = "1 = 2"
ls_replace = "id = " + string( ll_id )

ll_start_pos = Pos(ls_sql, ls_needle)

// Only enter the loop if you find ls_needle.
DO WHILE ll_start_pos > 0
    // Replace ls_needle with ls_replace.
    ls_sql = Replace(ls_sql, ll_start_pos,Len(ls_needle), ls_replace)

    // Find the next occurrence of ls_needle.
    ll_start_pos= Pos(ls_sql, ls_needle, ll_start_pos + Len(ls_replace))
LOOP

//Replace SQL
if dw_products.Setsqlselect(ls_sql) <> 1 then
    Messagebox("Error setting SQL select",sqlca.sqlerrtext)
return 1
...