2015-12-20 4 views
0

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

Я нашел фрагмент кода обновления SQL и переписал его для собственных нужд, но хотел бы, чтобы кто-то дал ему один раз, прежде чем я нажму кнопку выполнения, так как обновление буквально повлияет на сотни тысяч записей.

Так вот эти две базы данных:

База данных 1: Movement

  • Таблица 1: ItemMovement
  • Колонка 1: LongDescription (тип данных: текст/до 40 символов)

База данных 2: Item

  • Таблица 2: ItemRecord
  • Колонка 2: Description (тип данных: текст/до 20 знаков)

Цель: установить Column1 от DB1 к значению Colum2 из db2.

Вот фрагмент кода:

update table1 
set table1.longdescription = table2.description 
from movement..itemmovement as table1 
inner join item..itemrecord as table2 on table1.itemcode = table2.itemcode 
where table1.longdescription <> table2.description 

Я добавил последний «где» линия для предотвращения SQL от обновления колонки, где она уже соответствует исходной таблице.

Это должно выполняться быстрее и просто обновлять столбцы, содержащие мусор. Но, как оно есть, похоже ли это, что он будет работать? И, наконец, это простой процесс, используя SQL Server 2005 Express, чтобы просто выполнить резервное копирование всего Movement db до того, как я его выполнил? И если это испортится, просто восстановите его?

В качестве альтернативы, необходимо ли снова перелистывать таблицы как таблицу1 и таблицу 2? Действительно для того, чтобы выполнить такой SQL-запрос:

update movement..itemmovement 
set itemmovement.longdescription = itemrecord.description 
from movement..itemmovement 
inner join item..itemrecord on itemmovement.itemcode = itemrecord.itemcode 
where itemmovement.longdescription <> itemrecord.description 

Большое спасибо!

+0

Запрос выглядит довольно прилично. Почему бы вам просто не создать новый столбец под названием 'movement.itemmovement.longdescription_test' и обновить его с помощью этого запроса? После обновления вы можете проверить, правильна ли информация в этом поле или нет. Если это правильно, просто запустите 'update movement.itemmovement set longdescription = longdescription_test', а затем отпустите столбец' longdescription_test'? – zedfoxus

+0

Я нахожусь «на дому, обучаемом Google» на SQL, и только узнал о некоторых утверждениях и обновлениях из одной таблицы. Я не знал, что вы можете создать столбец таким образом. Можете ли вы рассказать о синтаксисе или все это будет одинаковым, если я создам его с помощью графического интерфейса SQL Express? Btw, я обновил свой OP с более прямым запросом обновления. Мысли? –

+0

Кто вам дал эту задачу? Знают ли они, что вы спрашиваете такие вещи здесь? – csmckelvey

ответ

0

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

update m 
set m.longdescription = i.description 
from movement..itemmovement as m 
inner join item..itemrecord as i on m.itemcode = i.itemcode 
where m.longdescription <> i.description 

В приведенном выше запросе я сократил псевдоним, используя m для itemmovement и i для itemrecord.

Когда большое количество записей должно быть обновлено, и возникает вопрос, будет ли это удачным или нет, всегда делайте копию в тестовой базе данных (находясь на тестовом сервере) и пробуйте ее там. В этом случае одной из самых безопасных ставок было бы сначала создать новое поле и называть его longdescription_text.Вы можете сделать это с SQL Server Management Studio Express (SSMS) или с помощью команды ниже:

use movement; 
alter table itemmovement add column longdescription_test varchar(100); 

Синтаксис здесь говорит alter table itemmovement и add a new column called longdescription_test с типом данных varchar(100). Если вы создаете новый столбец с использованием SSMS, в фоновом режиме SSMS будет запускать ту же инструкцию alter table, чтобы создать новый столбец.

Вы можете затем выполнить

update m 
set m.longdescription_test = i.description 
from movement..itemmovement as m 
inner join item..itemrecord as i on m.itemcode = i.itemcode 
where m.longdescription <> i.description 

Посмотри данные в longdescription_test случайным образом. Вы действительно можете сделать выборочную проверку быстрее, запустив:

select * from movement..itemmovement 
where longdescription <> longdescription_test 
    and longdescription_test is not null 

Если информация в longdescription_test выглядит хорошо, вы можете изменить оператор обновления для установки m.longdescription = i.description и выполнить запрос снова.

Перед обновлением проще создать копию таблицы itemmovement. Для того, чтобы сделать копию, вы можете просто сделать:

use movement; 
select * into itemmovement_backup from itemmovement; 

Если обновление не удастся при желании, вы можете укоротить itemmovement и скопировать данные обратно из itemmovement_backup.

0

Zedfoxus предоставил БОЛЬШОЕ объяснение по этому поводу, и я ценю его. Это отличный справочник в следующий раз. После прочтения некоторых примеров синтаксиса я был достаточно уверен в возможности запуска второго запроса SQL-запроса, который у меня есть в моем OP. К счастью, данные здесь не обязательно «живут», поэтому при низком риске могут повредить что-либо, даже во время работы. Учитывая природу данных, обновленное выполнено отлично, обновляя все 345 000 записей!

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