2016-09-30 19 views
2

我试图运行下面的查询:BCP改变标题栏为了

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

表:

Process Verb Match 
P1  V1  FALSE 
P2  V2  TRUE 

CSV:

Match Process Verb 
P1  V1   FALSE 
P2  V2   TRUE 

出于某种原因,BCP被排序标题行按字母顺序。

以上命令用于在SQL Server 2008 R2中绝对正常工作,但由于某种原因它在SQL Server 2012中搞乱了......我该如何解决这个问题?

+1

怪异的行为!如果尝试:'bcp“,请选择Process,Verb,Match from myTable”queryout C:\ Temp \ myTable.csv -t,-c -T -S'?或'bcp myTable in“C:\ Temp \ myTable.csv”-c -T -S' – gofr1

+0

@ gofr1: 此程序有几个问题:1-我使用动态列数,2 - Number是列可以高达150-200,3 - 它曾经在SQL 2008 R2中工作 – Ishan

+0

您是否安装了SS2012的最新Service Pack?其次:如果您编写表格(从SSMS,右键单击表格和脚本CREATE),是否按照预期的顺序排列列? –

回答

0

我想通了自己。这不是BCP,而是SQl中的Syscolumns表引起的。

我正在从sys.syscolumns读取列标题。虽然在SQL 2008 R2,在SYS.SYSCOLUMNS id字段是表中的每一列独特,它给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') 
+0

这就是为什么它包含[MCVE]非常重要,以便人们可以重现您的问题。你的问题没有包含任何有关'sys.syscolumns'的信息。如果你有的话,人们可以早日帮助你。 –

0

也许你可以尝试创建一个选择的顺序列的查询,如发现INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION,像下面的脚本:

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

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

DECLARE @bcp_cmd VARCHAR(8000)= 
    'BCP ' + 
     '"SELECT '[email protected]+' FROM '+QUOTENAME(@target_table)+'" '+ 
     'QUERYOUT "'[email protected]_file+'" '+ 
     '-t, -c -T -S ' + @@SERVERNAME + ' -d ' + DB_NAME(); 

--SELECT @bcp_cmd; 

EXEC xp_cmdshell @bcp_cmd;