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

Откуда: Москва
Сообщений: 24
предыстория.
есть временная таблица с простой структурой
CREATE TABLE [dbo].[ref](
	[1C] [nvarchar](max) NULL,
	[2C] [nvarchar](max) NULL,
	[3F] [nvarchar](max) NULL,
	[4N] [nvarchar](max) NULL,
	[5K] [nvarchar](max) NULL,
	[6N] [nvarchar](max) NULL,
	[7N] [nvarchar](max) NULL,
	[8N] [nvarchar](max) NULL)

в нее залил залил 100 файлов общим количеством примерно миллион записей с помощью BULK INSERT
DECLARE _Cursor_ CURSOR FOR
SELECT [filename]
  FROM [dbo].[filename];

OPEN _Cursor_;

FETCH NEXT FROM _Cursor_ INTO @filename;
WHILE @@FETCH_STATUS = 0
BEGIN

			SET @cmd = 
			'Use [CoreSpr] BULK INSERT [dbo].[ref] FROM '''
			 + @path + @filename +			
			''' WITH (FIELDTERMINATOR = '';'', ROWTERMINATOR = ''\n'',  DATAFILETYPE=''CHAR'', CODEPAGE=''ACP'') '
						
			Exec(@cmd); 

FETCH NEXT FROM _Cursor_ INTO @filename;
END;

CLOSE _Cursor_;
DEALLOCATE _Cursor_;


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

DECLARE _Cursor_ CURSOR FOR
SELECT [1C]
      ,[2C]
      ,[3F]
      ,[4N]
      ,[5K]
      ,[6N]
      ,[7N]
      ,[8N]
  FROM [dbo].[ref];

OPEN _Cursor_;					

FETCH NEXT FROM _Cursor_ INTO @1C, @2C, @3F, @4N, @5K, @6N, @7N, @8N;
WHILE @@FETCH_STATUS = 0
BEGIN
         /* здесь много кода*/
	SELECT [Id] FROM [dbo].[Set] WHERE ([code] = @2С);
	/* здесь еще куча кода*/

FETCH NEXT FROM _Cursor_ INTO @1C, @2C, @3F, @4N, @5K, @6N, @7N, @8N;
END;

CLOSE _Cursor_;
DEALLOCATE _Cursor_;


так вот проблема в том что
SELECT [Id] FROM [dbo].[Set] WHERE ([code] = @2С);

всегда возвращает NULL
данные все на месте. типы данных совпадают.
если выполнять руками запрос с параметром заданным руками
SELECT [Id] FROM [dbo].[Set] WHERE ([code] = '1065');

то все работает.
такое ощущение что BULK INSERT вставил данные как-то криво. но визуально они нормально все выглядят, все на местах.
если приводить их на пример к int, т.к. это простые числа, тоже результат нулевой
SELECT [Id] FROM [dbo].[Set] WHERE (CONVERT(int,[extcode]) = CONVERT(int,@2C));


как победить это зло ? что не так ?
7 ноя 15, 22:06    [18383961]     Ответить | Цитировать Сообщить модератору
 Re: обработка данных после BULK INSERT  [new]
MKVDT
Guest
Профайлер смотрели?
7 ноя 15, 22:16    [18383979]     Ответить | Цитировать Сообщить модератору
 Re: обработка данных после BULK INSERT  [new]
Glory
Member

Откуда:
Сообщений: 104751
rawman
такое ощущение что BULK INSERT вставил данные как-то криво.

А как можно так криво вставить данные, что запрос с константой выдает результат
SELECT [Id] FROM [dbo].[Set] WHERE ([code] = '1065')
а запрос с переменной - не выдает результат
SELECT [Id] FROM [dbo].[Set] WHERE ([code] = @2С);
7 ноя 15, 22:20    [18383987]     Ответить | Цитировать Сообщить модератору
 Re: обработка данных после BULK INSERT  [new]
MKTDT
Guest
Может у таблицы ref в столбец [2C] все же есть null? И эти записи пошли в первую очередь у курсора, попробуйте сделать
DECLARE _Cursor_ CURSOR FOR
SELECT top 2 [1C]
      ,[2C]
      ,[3F]
      ,[4N]
      ,[5K]
      ,[6N]
      ,[7N]
      ,[8N]
  FROM [dbo].[ref]
where [2C] is not null
7 ноя 15, 22:24    [18383994]     Ответить | Цитировать Сообщить модератору
 Re: обработка данных после BULK INSERT  [new]
Glory
Member

Откуда:
Сообщений: 104751
В переменной то @2С что получается ?
select @2С, cast(@2С as varbinary)
7 ноя 15, 22:35    [18384031]     Ответить | Цитировать Сообщить модератору
 Re: обработка данных после BULK INSERT  [new]
rawman
Member

Откуда: Москва
Сообщений: 24
MKTDT,

на примерно миллион импортированных записей есть 9 где @2C is NULL

автор
Glory
В переменной то @2С что получается ?
select @2С, cast(@2С as varbinary)


для теста делал так:
SELECT @1C, @2C, @3F, @4N, @5K, @6N, @7N, @8N;

а потом сразу
SELECT [Id] FROM [dbo].[Set] WHERE ([code] = @2С);


во всех переменных данные есть
7 ноя 15, 22:41    [18384044]     Ответить | Цитировать Сообщить модератору
 Re: обработка данных после BULK INSERT  [new]
MKVDT
Guest
Пришлите трассу профайлера в момент выполнения этого селетка.
7 ноя 15, 22:45    [18384052]     Ответить | Цитировать Сообщить модератору
 Re: обработка данных после BULK INSERT  [new]
MKVDT
Guest
Не верю в чудеса, я думаю тут могут быть след. проблемы:
1. несовпадение типов
2. в таблице из которой мы делаем селект, просто нет таких значений.
7 ноя 15, 22:52    [18384071]     Ответить | Цитировать Сообщить модератору
 Re: обработка данных после BULK INSERT  [new]
Glory
Member

Откуда:
Сообщений: 104751
rawman
о всех переменных данные есть

Я спрашивал про одну переменную
select @2С, cast(@2С as varbinary), '1065', cast('1065' as varbinary)
7 ноя 15, 22:55    [18384076]     Ответить | Цитировать Сообщить модератору
 Re: обработка данных после BULK INSERT  [new]
rawman
Member

Откуда: Москва
Сообщений: 24
Glory,

респект тебе, натолкнул меня на правильную мысль, я не в ту сторону копал...
проблема не в типах данных и их преобразовании или сравнении

я наверное сильно почистил код, полностью строка с запросом выглядит так

SELECT @id = [Id] FROM [dbo].[Set] WHERE ([code] = @2С);

а дальше идет проверка, сравнение и т.д...

так вот проблема в том что конструкция SELECT @id = [Id] если запрос возвращает NULL не обнуляет переменную, в ней остаётся значение от предыдущей итерации. век живи, век учись и дураком помрешь...

тема закрыта. всем спасибо.
7 ноя 15, 23:04    [18384102]     Ответить | Цитировать Сообщить модератору
 Re: обработка данных после BULK INSERT  [new]
Mike_za
Member

Откуда: Москва
Сообщений: 1176
rawman,

В таких ситуациях можно было бы писать
Set @id = (select ...)

И она обнулится, если пустой результат
7 ноя 15, 23:45    [18384186]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить