Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 BULK INSERT (OPENROWSET) как вставить NULL?  [new]
wissem
Member

Откуда:
Сообщений: 15
Добрый день, хочу при импорте файла с разделителями "\t", концом строки "\n" при пустом поле в файле в таблицу вставлять null, как это реализовать?
пример скрипта для вставки
INSERT INTO Biovia_Prices   
  SELECT *  
      FROM  OPENROWSET(BULK  '\\server\public\outputMain.txt',  
      FORMATFILE='\\server\public\id_skip.xml'
       ) AS t1;


FORMATFILE
<?xml version="1.0"?>  
<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">  
 <RECORD>  
  <FIELD ID="1" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100"/>
  <FIELD ID="2" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100"/>  
  <FIELD ID="3" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100"/>  
  <FIELD ID="4" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100"/>  
  <FIELD ID="5" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100"/>  
  <FIELD ID="6" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100"/>  
  <FIELD ID="7" xsi:type="CharTerm" TERMINATOR="\t" MAX_LENGTH="100"/>
  <FIELD ID="8" xsi:type="CharTerm" TERMINATOR="\n" MAX_LENGTH="100"/>  
 </RECORD>  

 <ROW>  
  <COLUMN SOURCE="1" NAME="mdlnumber" xsi:type="SQLNVARCHAR"/>  
  <COLUMN SOURCE="2" NAME="sub_code" xsi:type="SQLNVARCHAR"/>  
  <COLUMN SOURCE="3" NAME="supplier_name" xsi:type="SQLNVARCHAR"/>  
  <COLUMN SOURCE="4" NAME="weight_val" xsi:type="SQLFLT8"/>  
  <COLUMN SOURCE="5" NAME="weight_type" xsi:type="SQLNVARCHAR"/>  
  <COLUMN SOURCE="6" NAME="price" xsi:type="SQLFLT8"/> 
  <COLUMN SOURCE="7" NAME="currency" xsi:type="SQLNVARCHAR"/> 
  <COLUMN SOURCE="8" NAME="purity" xsi:type="SQLNVARCHAR"/> 
  
 </ROW>  
</BCPFORMAT> 


Импортируемый файл
примерно так
автор
MFCD00000001 AB118546 ABCR 1 G 123.45 EUR 90%
MFCD00000001 AB118546 ABCR 10 G 123.00 EUR


DDL таблицы
CREATE TABLE [dbo].[Biovia_Prices] (
  [id] int IDENTITY(1, 1) NOT NULL,
  [mdlnumber] varchar(50) COLLATE SQL_Ukrainian_CP1251_CI_AS NOT NULL,
  [sub_code] varchar(50) COLLATE SQL_Ukrainian_CP1251_CI_AS NOT NULL,
  [supplier_name] varchar(50) COLLATE SQL_Ukrainian_CP1251_CI_AS NOT NULL,
  [weight_val] float NOT NULL,
  [weight_type] varchar(50) COLLATE SQL_Ukrainian_CP1251_CI_AS NOT NULL,
  [price] float NOT NULL,
  [currency] varchar(50) COLLATE SQL_Ukrainian_CP1251_CI_AS NOT NULL,
  [purity] varchar(50) COLLATE SQL_Ukrainian_CP1251_CI_AS NULL,
  CONSTRAINT [PK_biovia_prices] PRIMARY KEY CLUSTERED ([id])
)
ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [Biovia_Prices_idx] ON [dbo].[Biovia_Prices]
  ([sub_code])
WITH (
  PAD_INDEX = OFF,
  DROP_EXISTING = OFF,
  STATISTICS_NORECOMPUTE = OFF,
  SORT_IN_TEMPDB = OFF,
  ONLINE = OFF,
  ALLOW_ROW_LOCKS = ON,
  ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [Biovia_Prices_idx2] ON [dbo].[Biovia_Prices]
  ([supplier_name])
WITH (
  PAD_INDEX = OFF,
  DROP_EXISTING = OFF,
  STATISTICS_NORECOMPUTE = OFF,
  SORT_IN_TEMPDB = OFF,
  ONLINE = OFF,
  ALLOW_ROW_LOCKS = ON,
  ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [Biovia_Prices_idx3] ON [dbo].[Biovia_Prices]
  ([currency])
WITH (
  PAD_INDEX = OFF,
  DROP_EXISTING = OFF,
  STATISTICS_NORECOMPUTE = OFF,
  SORT_IN_TEMPDB = OFF,
  ONLINE = OFF,
  ALLOW_ROW_LOCKS = ON,
  ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [Biovia_Prices_uq] ON [dbo].[Biovia_Prices]
  ([mdlnumber])
WITH (
  PAD_INDEX = OFF,
  DROP_EXISTING = OFF,
  STATISTICS_NORECOMPUTE = OFF,
  SORT_IN_TEMPDB = OFF,
  ONLINE = OFF,
  ALLOW_ROW_LOCKS = ON,
  ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
12 окт 17, 12:17    [20863608]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT (OPENROWSET) как вставить NULL?  [new]
Павел Воронцов
Member

Откуда: Новосибирск
Сообщений: 2382
Блог
wissem,

а что не вставляется то?
12 окт 17, 14:18    [20864186]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT (OPENROWSET) как вставить NULL?  [new]
wissem
Member

Откуда:
Сообщений: 15
последнее поле в файле purity. Вместо пустого значения в таблицу должен вставляться null.
12 окт 17, 14:50    [20864360]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT (OPENROWSET) как вставить NULL?  [new]
aleks222
Guest
wissem
последнее поле в файле purity. Вместо пустого значения в таблицу должен вставляться null.

И как BULK должен догадаться о вашем желании?
12 окт 17, 15:17    [20864476]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT (OPENROWSET) как вставить NULL?  [new]
invm
Member

Откуда: Москва
Сообщений: 9128
https://docs.microsoft.com/ru-ru/sql/relational-databases/import-export/keep-nulls-or-use-default-values-during-bulk-import-sql-server - раздел "Сохранение значений NULL"
12 окт 17, 15:27    [20864527]     Ответить | Цитировать Сообщить модератору
 Re: BULK INSERT (OPENROWSET) как вставить NULL?  [new]
wissem
Member

Откуда:
Сообщений: 15
Как при том запросе, который я написал в теме, через openrowset сделать то? там директива keepnulls не работает. Для того чтоб запустить BCP утилиту из командной строки у меня нет доступа к серверу. Уже сделал с помощью не xml formatfile по примеру файла, который генерируется BCP, но без BCP.
12 окт 17, 17:36    [20865151]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить