首页 > 解决方案 > 为 BCP 创建 SQL 查询的字符串格式问题

问题描述

我想将一些静态数据用于新的 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:\csv\test\' + @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:\csv\test\AL_header.txt -c -t, -T

并给出错误:

Error = [Microsoft][ODBC Driver 13 for SQL Server][SQL Server]Invalid column name 'ver4'.

我想将@version和的值导出@TotalRecords到 CSV 文件中。

但是我陷入了将 SQL 查询创建为字符串的字符串格式问题。

标签: sqlsql-serverbcp

解决方案


为列命名,并在引号中输出值。使用连续的单引号将引号传递给字符串:

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:\csv\test\AL_header.txt -c -t, -T

推荐阅读