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')
我正在尝试 运行 以下查询:
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')