BCP 更改 header 列顺序

BCP changing header column order

我正在尝试 运行 以下查询:

BCP "select * from myTable " queryout C:\Temp\myTable.csv -t, -c -T -S

Table:

Process  Verb   Match
P1       V1     FALSE
P2       V2     TRUE

CSV:

Match    Process    Verb
P1       V1         FALSE
P2       V2         TRUE

出于某种原因,BCP 正在按字母顺序对 header 行进行排序。

上述命令过去在 SQL Server 2008 R2 中运行得非常好,但由于某种原因它在 SQL Server 2012 中出现问题...我该如何解决这个问题?

也许您可以尝试创建一个查询,按照 INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION 中找到的顺序选择列,如以下脚本所示:

DECLARE @target_table SYSNAME='myTable';
DECLARE @target_file VARCHAR(1024)='C:\Temp\'+@target_table+'.txt';

DECLARE @cols VARCHAR(8000)=STUFF((
    SELECT 
        ','+QUOTENAME(column_name)
    FROM 
        INFORMATION_SCHEMA.COLUMNS 
    WHERE 
        TABLE_NAME=@target_table
    ORDER BY    
        ORDINAL_POSITION
    FOR XML
        PATH(''), TYPE).value('.[1]','VARCHAR(MAX)'),
    1,1,''
);

DECLARE @bcp_cmd VARCHAR(8000)=
    'BCP ' + 
        '"SELECT '+@cols+' FROM '+QUOTENAME(@target_table)+'" '+
        'QUERYOUT "'+@target_file+'" '+
        '-t, -c -T -S ' + @@SERVERNAME + ' -d ' + DB_NAME();

--SELECT @bcp_cmd;

EXEC xp_cmdshell @bcp_cmd;

我自己想出来了。不是 BCP,是 SQl 中的 Syscolumns table 导致的。

我正在阅读 sys.syscolumns 的专栏 headers。在 Sql 2008 R2 中,sys.syscolumns 中的 id 字段对于 table 的每一列都是唯一的,它在 Sql 2014 中给出相同的值。

所以,当我 运行 下面分别查询 Sql 2008 年和 2014 年时

SELECT distinct name,
          ROW_NUMBER() OVER ( ORDER BY id) AS RowNumber FROM    sys.syscolumns 
   WHERE   id = OBJECT_ID('MyDB.dbo.MyTbl')

在Sql 2008年,它给出了按每列唯一的id排序的数据。但是在 Sql 2014 年,由于所有列的 id 都相同,因此它按字母顺序对结果进行排序。

现在,我将查询更改为

SELECT distinct name,
     ROW_NUMBER() OVER ( ORDER BY colid) AS RowNumber FROM sys.syscolumns
WHERE id = OBJECT_ID('MyDB.dbo.MyTbl')