2016-09-30 1 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 

По какой-то причине, ППГ, сортировки строка заголовка в алфавитном порядке.

Приведенная выше команда использовалась для работы в 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 в" C: \ Temp \ myTable.csv "-c -T -S' – gofr1

+0

@ gofr1: Есть несколько проблем с этим утверждением: 1- Я создаю это на лету с динамическим числом столбцов , 2 - Число столбцов может быть до 150-200, 3 - Оно использовалось для работы в sql 2008 R2 – Ishan

+0

Был ли установлен последний пакет обновления для SS2012? Во-вторых: если вы создаете скрипт таблицы (из SSMS, таблицы правого щелчка и скрипта CREATE), это порядок столбцов, как и следовало ожидать? –

ответ

0

я понял это сам. Это не BCP, это Syscolumns table в SQl, который вызывал это.

Я читал заголовки столбцов из sys.syscolumns. В то время как в Sql 2008 R2, поле идентификатора в sys.syscolumns является уникальным для каждого столбца таблицы, это дает то же значение в 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; 
Смежные вопросы