### 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)

return schema_file_to_upload
    def _upload_to_gcs(self, file_to_upload):
        """Upload a file (data split or schema .json file) to Google Cloud Storage."""
        hook = GCSHook(
            gcp_conn_id=self.gcp_conn_id,
            delegate_to=self.delegate_to,
            impersonation_chain=self.impersonation_chain,
        )
        is_data_file = file_to_upload.get("file_name") != self.schema_filename
        metadata = None
        if is_data_file and self.upload_metadata:
            metadata = {"row_count": file_to_upload["file_row_count"]}
        object_name = file_to_upload.get("file_name")
        if is_data_file and self.partition_columns:
            
            partition_values = file_to_upload.get("partition_values")
            head_path, tail_path = os.path.split(object_name)
            partition_subprefix = [
                f"{col}={val}" for col, val in zip(self.partition_columns, partition_values)
            ]
            object_name = os.path.join(head_path, *partition_subprefix, tail_path)
        hook.upload(
            self.bucket,
            object_name,
            file_to_upload.get("file_handle").name,
            mime_type=file_to_upload.get("file_mime_type"),
            gzip=self.gzip if is_data_file else False,
            metadata=metadata,
        )