2014-10-08 3 views
0

Мне недавно дали разрешения на обновление одной таблицы в нашей базе данных, но это не то, что я делал раньше, и я не собираюсь что-то делать. Я попытался найти что-то в Интернете, которое было похоже на то, что я хочу делать без успеха.Первый раз Обновление таблицы

Имя таблицы - dbo.Player_Miles и содержит только два столбца данных Player_ID и Miles, оба из которых установлены как (int, null).

В настоящее время в этой таблице записано около 300 тыс. Записей, и у меня есть файл csv, который мне нужно использовать для обновления этой таблицы. В файле есть 500K записей, поэтому мне нужно, чтобы быть в состоянии:

ВСТАВИТЬ новые записи ~ 250K записей

UPDATE записи с тем, что есть новая информация ~ 200K записей

Оставить нетронутым и запись, имеет ту же информацию (хотя обновление тех же вещей не повредит базе данных будет ресурсом hog, я бы догадался) ~ 50K записей

Также не оставляйте нетронутыми любые записи в таблице, которые в настоящее время не находятся в обновленном файле. ~ 50к записей

Я использую SSMS 2008, но сервер 2000.

+0

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

ответ

1

Вы могли бы подойти к этому поэтапно ...

1) Резервное копирование базы данных

2) Создание временной таблицы SQL для хранения ваших записей обновления

create table Player_Miles_Updates (
    PlayerId int not null, 
    Miles int null) 

3) Загрузить записи из текстового файла в временную таблицу

bulk insert Player_Miles_Updates 
    from 'c:\temp\myTextRecords.csv' 
    with 
    (
     FIELDTERMINATOR =' ,', 
     ROWTERMINATOR = '\n' 
    ) 

4) Начинает совершение операции

begin transaction 

5) Вставьте ваши новые данные

insert into Player_Miles 
select PlayerId, Miles 
from Player_Miles_Updates 
where PlayerId not in (select PlayerId from Player_Miles) 

6) Обновление существующих данных

update Player_Miles 
set  Player_Miles.Miles = pmu.Miles 
from Player_Miles pm join Player_Miles_Updates pmu on pm.Player_Id = pmu.Player_Id 

7) Выберите несколько строк, чтобы убедиться, что вы хотели, чтобы это произошло, произошло

select * 
from Player_Miles 
where Player_Id in (1,45,86,14,83) -- use id's that you have seen in the csv file 

8a) Если все прошло хорошо

commit transaction 

8b) Если все не хорошо

rollback transaction 

9) Удалите временную таблицу

drop table Player_Miles_Updates 
+0

Это похоже на то, что я хочу, поэтому я тестирую его сейчас. Хотя у меня был вопрос на шаге 2, если мы создаем временную таблицу, если она не имеет # перед именем –

+0

Да, вы могли бы использовать '#' спереди. Это сделало бы его по-настоящему временной таблицей (то есть, которая исчезнет, ​​если вы закроете окно, в котором работаете). – paul

+0

Когда я сделал шаг 3, я получил следующую ошибку: Msg 170, Level 15, State 1, Line 6 Строка 6: Неправильный синтаксис рядом с '\ n'. –

1

Вы должны использовать SSIS (или DTS, который был заменен SSIS в SQL Server 2005). Используйте CSV в качестве источника и «поднимите» данные в таблицу назначения.

В SSIS существуют различные способы выполнения этой задачи.

Простым способом было бы использовать задачу поиска в Player_ID. Если есть совпадение, обновите значение и если нет совпадения, просто вставьте новое значение.

See this link for more informations on lookup-pattern-upsert

+0

Мне также нравится эта идея и буду смотреть на нее в будущем, но прямо сейчас я понятия не имею, как использовать SSIS, поскольку я все еще очень новичок в SQL и знаю только некоторые основные вещи о SSMS. –

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