#sql #sql-server #bcp
#sql #sql-server #bcp
Вопрос:
Я хочу использовать некоторые статические данные для нового запроса BCP и экспортировать извлеченные данные в CSV. Статические данные генерируются в результате после выполнения некоторой команды BCP ранее.
Но я столкнулся с проблемой форматирования строк при создании SQL-запроса с использованием этих переменных и генерации команды SQL.
Я просто хочу использовать следующий запрос в команде BCP:
select @version, @TotalRecords
Используемый мной запрос BCP является:
DECLARE
@version varchar(10),
@HeaderCmd VARCHAR(500),
@StateCode varchar(2),
@v_Header_path varchar(255),
@TotalRecords int;
SET @StateCode = 'AL'
SET @version = 'ver4'
SET @TotalRecords = 20
SET @v_Header_path ='c:csvtest' @StateCode '_header.txt'
SELECT @HeaderCmd = 'bcp '
'"select ' @version '" '
' queryout ' @v_Header_path
' -c -t, -T' ;
SELECT @HeaderCmd AS 'Command to execute';
EXECUTE master..xp_cmdshell @HeaderCmd;
Приведенная выше команда генерирует следующую команду sql:
bcp "select ver4" queryout c:csvtestAL_header.txt -c -t, -T
и выдает ошибку как:
Error = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Invalid column name 'ver4'.
Я хотел экспортировать значение @version
и @TotalRecords
в файл CSV.
Но я застрял в проблеме с форматированием строки для создания SQL-запроса в виде строки.
Комментарии:
1. Вам нужно заключить
@version
переменную в одинарные кавычки:SELECT @HeaderCmd = 'bcp ' '"select ''' @version '" ''''
или что-то подобное.
Ответ №1:
Дайте столбцу имя и выведите значение в кавычках. Используйте последовательные одинарные кавычки для передачи кавычки в строку:
select @HeaderCmd =
'bcp '
'"select ''' @stateCode ''' as stateCode, ''' @version ''' as version, ' convert(varchar(10), @totalRecords) ' as totalRecords" '
' queryout ' @v_Header_path
' -c -t, -T' ;
Затем это должно вывести:
bcp "select 'AL' as stateCode, 'ver4' as version, 20 as totalRecords" queryout c:csvtestAL_header.txt -c -t, -T
Комментарии:
1. извините за дополнительный вопрос, но что, если нужно выбрать две или более двух строк? здесь я также хочу выбрать
@TotalRecords
с@version
2. Вы хотите сказать, что хотите что-то вроде
bcp "select 'ver4' as version union all select 'ver5' as version" queryout c:...txt -c -c, -T
?3. нет, просто другие переменные, которые нужно включить в запрос выбора, здесь переменная будет
@TotalRecords
запросом, будет выглядеть примерно такselect @version, @TotalRecords
4. Отредактировано, чтобы включить две другие имеющиеся у вас переменные.