in reply to Variable are equal but don't behave that way

It sounds to me like $sql is an object with overloaded operations so that it returns a query string in a string context (and knows how to append to that string).

You need to show the results of ref($sql) and ref($sql2) to prove whether this is in fact the difference or not.

You could also try this:

my $sth = $self->dbh->prepare("$sql") or die "couldn't prepare: " . $self->dbh->errstr();
(note the added quotes) which is normally a bad idea but might fix things here.

My guess is that some DBx code is checking ref() when it shouldn't be. O-:

        - tye (but my friends call me "Tye")