2014-09-23 3 views
2

В настоящее время я разрабатываю программу на C#, которая берет гигантский лист excel (~ 14,300 строк, 90 столбцов) и его необходимо вставить в базу данных (SQL Server 2014). Пользователь может осуществлять поиск через БД для разных продуктов и в конечном итоге составлять котировку для клиента.sql заявление о слиянии для многих столбцов

Чтобы вставить, я успешно использую SQLBulkcopy для вставки строк excel в промежуточную таблицу. Проблема в том, что я хочу использовать оператор слияния, чтобы объединить мою промежуточную таблицу и реальную таблицу, так как, возможно, несколько загрузок одного и того же файла с очень небольшими изменениями с течением времени. Все SQL объединить примеры, я нахожу выглядеть примерно так:

MERGE INTO maintable as Target 
USING stagingtable as Source 
ON Target.columnA = Source.columnA 
WHEN MATCHED THEN 
UPDATE SET Target.Name = Source.Name 
WHEN NOT MATCHED THEN 
INSERT (columnA, Name) 
VALUES (Source.columnA, source.Name) 

заявление будет работать, но проблема в том, мой файл Excel имеет 90 столбцов. Есть ли способ обновить всю строку за раз или мне нужно обновить каждый из 90 столбцов строки?

+1

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

+0

yeh i реализовано после публикации. Мой первый пост, обычно просто люркер. –

+1

Вы можете обновлять/вставлять столько столбцов, сколько хотите, вы можете отвечать только на 2 условия, но помните, что целью является «существует ли эта запись? Если да, обновите, если нет вставки», вы не пытаетесь определить, строка, которая уже существует, изменилась. –

ответ

0

Вы должны перечислить все 90 столбцов один за другим, нет обновления всей строки. Перейдите в SSMS, выберите таблицу, щелкните правой кнопкой мыши, таблицу сценариев as -> update, и это даст вам список всех столбцов в скрипте, который вы можете изменить или скопировать/вставить в ваш скрипт слияния.

+0

Хм, это сэкономит мне часы ввода, спасибо. –

0

В транзакции слиянием будет обновляться только то, что вы говорите, и обычно только строка за раз. Он будет зависеть от целей слияния (вы можете объявить несколько). Я бы сказал, что всегда делает одну строку за раз, но это более смелое утверждение, чем я готов сделать, поскольку это может быть неправильно.

Если строка уже существует (т.е. совпадают с целями слияния), вам нужно только обновить нужные столбцы (вам не нужно делать каждый), если они не совпадают, тогда вы должны выполнить целая строка для вставки.

Это ответ на ваш вопрос или я пропустил какой вопрос?

Edit: Я думаю, что пакет SSIS будет лучше подходит для этого просто FYI :)

+0

лист excel - это большой прайс-лист с информацией о предлагаемых продуктах и ​​услугах. поэтому случайный столбец может меняться так же, как «лаборатория, в которой продукт обслуживается». важно, чтобы он обновлял всю строку, так как я не буду знать, какой столбец будет изменен пользователем. –

+0

Этот столбец должен иметь для него какой-то уникальный идентификатор, на который вы нацеливаетесь, а затем соответствующим образом присваиваете значения столбцам. Опять же, я думаю, что пакет SSIS будет более приятным, вы можете использовать BCP в эту временную таблицу, которую вы упомянули, а затем использовать пакет SSIS для объединения всех данных вместе. – alykins

0

Вы можете использовать MERGE заявление написать несколько столбцов. Он использует в основном тот же синтаксис, что и другие DML:

.... 
UPDATE SET A = a, B = b, ... 
... 

Аналогично для вставок.

Смежные вопросы