Игнорировать определенные столбцы при использовании BULK INSERT

У меня есть текстовый файл с разделителями-запятыми со структурой

field1   field2   field3   field4
1        2        3        4

Я написал следующий скрипт для массовой вставки текстового файла, но я хотел опустить столбец 3

create table test (field1 varchar(50),field2 varchar(50),field4 varchar(50))
go
bulk insert test
from 'c:\myFilePath'
with 
(fieldterminator=',',
rowterminator='\n'
)

Вставка работала нормально, но результаты вставки сделали field4 похожим на field3,field4, поэтому поле 3 фактически было просто сцеплено с field4. Плоские файлы, с которыми я работаю, представляют собой несколько концертов и не могут быть легко изменены. Есть ли способ использовать массовую вставку, но он игнорирует столбцы, которые не объявлены в операторе создания таблицы?

5 ответов

Решение

Вы можете использовать файл формата для этого:

http://msdn.microsoft.com/en-gb/library/ms178129.aspx

http://msdn.microsoft.com/en-gb/library/ms179250.aspx

Или, если вы хотите немного дерзкого способа, просто импортируйте все это и добавьте столбец.;)

Самый простой способ - создать представление, содержащее только те столбцы, которые вам нужны.

Затем массово вставьте в это представление.

Вы не можете игнорировать поле во время массовой вставки, вместо этого сделайте это. Загрузите все 4 столбца и удалите столбец, который вам не нужен

create table test (field1 varchar(50),field2 varchar(50), field3 varchar(50),field4 varchar(50))
go
bulk insert test
from 'c:\myFilePath'
with 
(fieldterminator=',',
rowterminator='\n'
)

ALTER TABLE test DROP column [field3]

Вы можете создать временную таблицу и вставить туда любые данные. После этого вы можете делать с ним все, что захотите.

      CREATE TABLE #TmpTable(
    [CategoryId] [int] IDENTITY(1,1) NOT NULL,
    [ParentCategoryId] [int] NULL,
    [CategoryTypeId] [int] NOT NULL,
    [Name] [varchar](255) NOT NULL,
    [Code] [varchar](255) NOT NULL,
    [AlternateName] [varchar](900) NOT NULL
)

BULK INSERT [dbo].[#TmpTable]
FROM 'C:\tmp\Categories.csv'
WITH
(
    FIELDTERMINATOR = ',',  --CSV field delimiter
    ROWTERMINATOR = '0x0a'   --Use to shift the control to next row         
)

-- original table insert
INSERT INTO [dbo].[Categories]
( 
    CategoryId,
    ParentCategoryId,
    CategoryTypeId,
    Name,
    Code,
    AlternateName,
    IsDeleted,
    SystemCreated
)
SELECT 
    CategoryId,
    ParentCategoryId,
    CategoryTypeId,
    Name,
    Code,
    AlternateName,
    0,           -- custom value missed by file
    GETDATE()    -- custom value missed by file
FROM #TmpTable

-- remove tmp table
DROP TABLE #TmpEventCategories

Вы действительно можете игнорировать определенные поля данных — см. это :

Используйте файл формата, как здесь ( ):

По сути, вы сопоставляете нежелательное поле исходных данных со столбцом 0 в вашей таблице. Да, файлы FMT странные, см. эту статью о переполнении стека. Файл fmt сопоставляет поля данных столбцам по порядковому номеру. столбец 1 — порядок полей исходных данных; столбец 6 — порядковый номер столбца целевой таблицы. Их нумерация начинается с 1, а 0 означает отсутствие сопоставления со столбцом.

Другие вопросы по тегам