Na verdade, não funciona como o que eu escrevi. Eu apenas codifico como:
set @preparedstmt = concat('SELECT tid, LENGTH(message) len FROM ? where tid=? and first=1');
prepare stmt from prepared_stmt;
execute stmt using v_tid;
drop prepare stmt;
Apenas tome cuidado com o nome da tabela, ela não deve ser substituída pelo placeholder. Então o @preparedstmt deve ser gerado com o método concat para fazer uma declaração, que é apenas substituir os parâmetros em condições pelo placeholder, mas não o nome da tabela.