Reputation: 3490
I'm want use $ macro in groovy GString. When i'm wrote this code
['cdata','tdata'].each {
def sql = "select * from $it_1"
}
i'm get error unknown property $it_
ok, i'm rewrite it
['cdata','tdata'].each {
def sql = "select * from ${it}_1"
}
then i'm get unwanted quotes in result string - "select * from 'cdata'_1"
Question is how i'm can use $-macro in GString to achive "select * from cdata_1" result string?
Upvotes: 0
Views: 3040
Reputation: 3490
Real answer was behind the question, so I'm sorry.
Groovy SQL makes parameterized query from GString, so after I had defined GString
def sql = "select * from ${it}_1";
I passed it to Groovy SQL and when I tried to execute the query, the actual query was
"select * from :?_1";
Of cource this drives MSSQL crazy.
Thanks to you all again, maybe someone will find this useful.
Upvotes: 0
Reputation: 585
You can use Groovy's Sql expand feature to help here. The following code will do the trick:
['cdata','tdata'].each {table -> def sql = "select * from ${Sql.expand table}_1" }
Using this method is particularly important if you have other parameters in your GString:
def name = 'Charlie Sheen'
def tables = ['normalPeople','crazyPeople']
tables.each { table ->
def sqlString = "select * from ${Sql.expand table} where name = ${name}"
/* Execute SQL here */
}
In the example above a prepared statement will still be used, and the contents of the 'name' variable will still be handled as a parameter (thus helping to protect you against SQL injection attacks) but the table variable parameter will be expanded correctly.
Upvotes: 4
Reputation: 96827
If the quotes are not from your IDE, or whatever you're evaluating your code in, you can do this:
['cdata','tdata'].each { def sql = "select * from ${it.replaceAll("'","")}_1" }
Upvotes: 1
Reputation: 33345
groovy:000> ['cdata','tdata'].each { def sql = "select * from ${it}_1"; println sql }
select * from cdata_1
select * from tdata_1
===> [cdata, tdata]
I dont see any quotes... that is why I was asking for clarification
Upvotes: 0