如何从查询中获取列列表?

时间:2019-01-09 10:01:40

标签: sql-server powerbuilder

PowerBuilder数据窗口具有一些参数,这些参数显然与数据窗口查询中的列匹配。查询太复杂。在我的脚本中,我在字符串变量中获取查询语法。我也得到在数据窗口中定义的参数列表。现在,我想从查询语法中获取列的列表,其中将列与检索参数进行比较。我不需要那些未将列与检索参数进行比较的列。

例如查询字符串的文本中是“ product_price> =:prod_price AND SupplierID为null AND store_id =:storeID”

我想获取除SupplierID外的所有列名,因为未将SupplierID与任何检索参数进行比较。对于许多case语句和运算符,查询太复杂了。

是否有任何简单的方法可以从查询字符串中获取列列表,而又不涉及复杂的字符串解析脚本?

1 个答案:

答案 0 :(得分:0)

一种简化问题的方法是不使用参数。

代替

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