### Apache Airflow Provider(s)

google

### Versions of Apache Airflow Providers

apache-airflow-providers-google==8.6.0

### Apache Airflow version

2.5.0

### Operating System

Debian GNU/Linux

### Deployment

Astronomer

### Deployment details

_No response_

### What happened

PR `Expose SQL to GCS Metadata (https://github.com/apache/airflow/pull/24382)` made a breaking change [here](https://github.com/apache/airflow/blob/3eee33ac8cb74cfbb08bce9090e9c601cf98da44/airflow/providers/google/cloud/transfers/sql_to_gcs.py#L286) that results in no files being returned when there are no data rows (empty table) rather than a single empty file as in the past.

### What you think should happen instead

I would like to preserve the original behavior of having at least one file returned even if it is empty. Or to make that behavior optional via a new parameter.

The original behavior can be implemented with the following code change:
FROM:
```
if file_to_upload["file_row_count"] > 0:
            yield file_to_upload
```
TO:
```
if file_no == 0 or file_to_upload["file_row_count"] > 0:
            yield file_to_upload
```

### How to reproduce

Create a DAG that uses BaseSQLToGCSOperator with a SQL command that references an empty SQL table or returns no rows. The `execute` method will not write any files.

### Anything else

_No response_

### Are you willing to submit PR?

- [ ] Yes I am willing to submit a PR!

### Code of Conduct

- [X] I agree to follow this project's [Code of Conduct](https://github.com/apache/airflow/blob/main/CODE_OF_CONDUCT.md)

"""Convert values from DBAPI to output-friendly formats."""
        return [
            self.convert_type(value, col_type_dict.get(name), stringify_dict=self.stringify_dict)
            for name, value in zip(schema, row)
        ]
    def _write_local_data_files(self, cursor):
        """
        Takes a cursor, and writes results to a local file.
        :return: A dictionary where keys are filenames to be used as object
            names in GCS, and values are file handles to local files that
            contain the data for the GCS objects.
        """
        org_schema = list(map(lambda schema_tuple: schema_tuple[0], cursor.description))
        schema = [column for column in org_schema if column not in self.exclude_columns]
        col_type_dict = self._get_col_type_dict()
        file_no = 0
        file_mime_type = self._get_file_mime_type()
        file_to_upload, tmp_file_handle = self._get_file_to_upload(file_mime_type, file_no)
        if self.export_format == "csv":
            csv_writer = self._configure_csv_file(tmp_file_handle, schema)
        if self.export_format == "parquet":
            parquet_schema = self._convert_parquet_schema(cursor)
            parquet_writer = self._configure_parquet_file(tmp_file_handle, parquet_schema)
        prev_partition_values = None
        curr_partition_values = None