Игнорировать определенные столбцы при использовании 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 означает отсутствие сопоставления со столбцом.