async def execute(self, sql, *params):
        """Executes the given operation substituting any markers with
        the given parameters.

        :param sql: the SQL statement to execute with optional ? parameter
            markers. Note that pyodbc never modifies the SQL statement.
        :param params: optional parameters for the markers in the SQL. They
            can be passed in a single sequence as defined by the DB API.
            For convenience, however, they can also be passed individually
        """
        if self._echo:
            logger.info(sql)
            logger.info("%r", sql)
        await self._run_operation(self._impl.execute, sql, *params)
        return self