The OP appears to be using DBD::ODBC and freetds. Placeholders have better support in that combination than DBD::Sybase/FreeTDS (AFAIK), but in any case the underlying API needs to support the placeholders when calling stored procedures, and the only way to check that is with FreeTDS's ODBC implementation.