2012-10-03 142 views
0

我想创建一个准备好的语句与like关键字:红宝石:预处理语句与像

这是SQL语句:

select user, 
     name_xml 
    from employee 
where name_xml like '<name>Varname</name>' 

Varname是一个动态变量。它可以由任何字符串值组成。对于如:Varname = 'John Smith'

代码: “?”

sql_name = @dbh.prepare(sql) 

sql = 'select user, name_xml from employee 
where name_xml like '<name>?</name>'' 

sql_name.execute (Varname) 

我现在面临的问题是与它应该包含Varname字符串值。谁能帮我这个?

谢谢!

回答

1

当它位于字符串文字中时,大多数驱动程序不会将?识别为占位符。为了解决这个问题,你有几个选择。首先,你可以做字符串工作红宝石:

sql = 'select user, name_xml from employee where name_xml like ?' 
#... 
sql_name.execute("<name>#{Varname}</name>") 

或者你可以在SQL碎片粘贴在一起:

sql = %q{select user, name_xml from employee where name_xml like '<name>' || ? || '</name>'} 
#... 
sql_name.execute(Varname) 

||应连接字符串在大多数数据库,但有些人会想+或改为concat(...)

请注意切换到%q{...}在第二个引用中,它的行为像单引号(Ruby)字符串,但您不必担心会转义SQL想要用于其字符串文字的嵌入式单引号。

0

感谢您的回复!这应该工作。我已经尝试了以下,它也可以很好地工作:

sql = 'select user, name_xml from employee 
where name_xml like ('#{test}')' 


Varname = "John Smith" 
    test = "%<name>"+Varname+"</name>%" 

sql_name= @dbh.prepare(sql) 

    sql_name.execute() 

    sql_name.fetch do |row| 
    sql_name = row[0] 
    end