Проблема с форматированием строк при создании SQL-запроса для BCP

#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. Отредактировано, чтобы включить две другие имеющиеся у вас переменные.