MichaelM имеет достойное решение, но, как указал рогатка ... findstr может быть слишком агрессивным и удалять строки данных, содержащие дефисы. Другой подход заключается в вызове sqlcommand для получения набора данных и последующем использовании set / p для получения первой строки из выходного файла и присвоения ее переменной. Затем удалите исходный файл оригинала. Затем выведите заголовки в новый файл. Наконец, направьте еще один sqlcmd без заголовка в этот файл.
sqlcmd -S server -d database -E -Q "exec myStoredProcedure" -W -o my_headers.csv -m-1
set /p headers=< my_headers.csv
del my_headers.csv
echo %headers% > my_data.csv
sqlcmd -S server -d database -E -Q "exec myStoredProcedure" -W -m-1 -h-1 >> my_data.csv
Также Top 0 - хороший выбор для создания «файла только заголовков», но только если вы используете оператор select. Если вы вызываете хранимую процедуру, изучите использование FMTONLY ON, чтобы получить заголовки только из SP.
sqlcmd -S server -d database -E -Q "Set NOCOUNT ON; Set FMTONLY ON; exec myStoredProcedure" -W -o my_headers.csv -m-1
Предостережение о том, что FMTONLY ON нельзя использовать против SP, использующих таблицы #temp. Это потому, что FMTONLY ON не выполняет SP. Это только захватывает метаданные. Но если имена столбцов взяты из таблиц, которые не существуют до выполнения, вы не можете получить имена этих столбцов.