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

row = [value if value is not None else self.null_marker for value in row]
                csv_writer.writerow(row)
            elif self.export_format == "parquet":
                row = self.convert_types(schema, col_type_dict, row)
                if self.null_marker is not None:
                    row = [value if value is not None else self.null_marker for value in row]
                row_pydic = {col: [value] for col, value in zip(schema, row)}
                tbl = pa.Table.from_pydict(row_pydic, parquet_schema)
                parquet_writer.write_table(tbl)
            else:
                row = self.convert_types(schema, col_type_dict, row)
                row_dict = dict(zip(schema, row))
                tmp_file_handle.write(
                    json.dumps(row_dict, sort_keys=True, ensure_ascii=False).encode("utf-8")
                )
                
                tmp_file_handle.write(b"\n")
            
            fppos = tmp_file_handle.tell()
            tmp_file_handle.seek(0, os.SEEK_END)
            file_size = tmp_file_handle.tell()
            tmp_file_handle.seek(fppos, os.SEEK_SET)
            if file_size >= self.approx_max_file_size_bytes:
                file_no += 1
                if self.export_format == "parquet":
                    parquet_writer.close()
                file_to_upload["partition_values"] = curr_partition_values
                yield file_to_upload
                file_to_upload, tmp_file_handle = self._get_file_to_upload(file_mime_type, file_no)
                if self.export_format == "csv":