【问题标题】:Getting column names with BCP queryout使用 BCP queryout 获取列名
【发布时间】:2026-01-07 04:05:02
【问题描述】:

我需要将表 BCP 转换为制表符分隔的文件,但我需要表的第一条记录中的列名。问题 1:我认为 BCP 没有为此提供开关是对的吗?问题2:如果不是,为什么?

我尝试了以下操作:

BCP "declare @colnames varchar(max); select @colnames=coalesce (@colnames+char(9), '') 
+ Column_Name from db.information_Schema.columns where table_name='table1' order by 
ordinal_position; select @colnames" queryout Table1_Columns.tsv -S?? -U?? -P?? -f** -e**

格式文件如下所示:

9.0
1
1 SQLCHAR 0 100 "\r\n" 1 Column_Names SQL_Latin1_General_CP1_CI_AS

这给我一个列名的文件,然后第二个 BCP 命令给我一个数据文件,我只是 DOS 将两者复制在一起。问题3:我是聪明还是什么?问题4:为什么它不起作用?我得到了错误:

SQLState = S1000, NativeError = 0
Error = [Microsoft][SQL Native Client]Host-file columns may be skipped only when 
copying into the Server

【问题讨论】:

    标签: sql sql-server bcp


    【解决方案1】:

    bcp 不支持将列标题与数据一起导出,但是有一些解决方法,例如将标题导出到单独的文件中,然后将标题和数据文件合并如下:

    exec master..xp_cmdshell 'BCP "select 'SETTINGS_ID','GROUP_NAME'" queryout d:\header.csv  -c  -T -t,'
    
    exec master..xp_cmdshell 'BCP "select SETTINGS_ID,GROUP_NAME from [DB]..[TABLE]" queryout "d:\columns.csv" -c -t, -T '
    
    exec master..xp_cmdshell 'copy /b "d:\header.csv"+"d:\columns.csv" "d:/result.csv"'
    

    您也可以删除未使用的文件:

    exec master..xp_cmdshell 'del "d:\header.csv"'
    exec master..xp_cmdshell 'del "d:\columns.csv"'
    

    或者,也许您可​​以将所有数据合并到一个视图中(添加标题)并将其导出

    【讨论】:

    • 第一行对我不起作用:'SETTINGS_ID' is not a recognized option。有什么线索吗?
    • 你必须用你自己的列标题替换它。
    • 如何使用以位置为参数的复制命令?例如:EXEC master..xp_cmdshell 'copy /b "' + @OutputLocationHeader +'" + "'+ @OutputLocationData + '" "' + @OutputLocation +'"' 第一个 + 符号给我一个错误