2016-09-30 40 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;