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

Откуда:
Сообщений: 243
Есть 2 базы. В каждой из них есть по таблице одинаковой структуры. Обе таблицы имеют одно и то же ключевое поле.
Таблицы заполнены некоторыми данными.
Необходимо написать скрипт, который бы скопировал из одной базы в другую содержимое этих таблиц: добавил недостающие записи и изменил те, у которых значение ключевого поля совпадет.
4 апр 12, 16:36    [12365602]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
harisma,

MERGE
4 апр 12, 16:38    [12365624]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
harisma
Member

Откуда:
Сообщений: 243
MERGE - штука хорошая, только в SQL 2000 ее еще не было :(
4 апр 12, 16:41    [12365646]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
harisma
MERGE - штука хорошая, только в SQL 2000 ее еще не было :(

мердж - сахар, легко реализовать руками через EXISTS
4 апр 12, 16:43    [12365671]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
разбейте мерж на инсёрт и апдейт с условиями
4 апр 12, 16:44    [12365678]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
harisma
Member

Откуда:
Сообщений: 243
Knyazev Alexey
мердж - сахар, легко реализовать руками через EXISTS

Это то мне и надо. Об этом и прошу помочь.
Собственно можно было бы и через UPDATE это решить, но перечислять все поля таблицы и присваивать им значения из источника - как-то нерационально...
4 апр 12, 16:46    [12365704]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
harisma
Knyazev Alexey
мердж - сахар, легко реализовать руками через EXISTS

Это то мне и надо. Об этом и прошу помочь.
Собственно можно было бы и через UPDATE это решить, но перечислять все поля таблицы и присваивать им значения из источника - как-то нерационально...


так update и insert в любом случае писать придётся. и поля все перечислять
4 апр 12, 16:49    [12365733]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
harisma
но перечислять все поля таблицы и присваивать им значения из источника - как-то нерационально...


а иначе как?
4 апр 12, 16:49    [12365734]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
harisma
Собственно можно было бы и через UPDATE это решить, но перечислять все поля таблицы и присваивать им значения из источника - как-то нерационально...

Можно удалить все совпадающие по ИД записи.
Чтобы можно было сделать INSERT.
4 апр 12, 16:51    [12365751]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
harisma
Member

Откуда:
Сообщений: 243
Knyazev Alexey
а иначе как?


Ну, как вариант, удалить эту запись и вновь ее (уже измененную) добавить.
4 апр 12, 16:52    [12365755]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
harisma
Member

Откуда:
Сообщений: 243
Glory
Можно удалить все совпадающие по ИД записи.
Чтобы можно было сделать INSERT.


Я тоже к такому варианту больше склоняюсь. Вот только скрипт бы сделать оптимальным. И по возможности без использования курсоров.
4 апр 12, 16:53    [12365779]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
harisma
тоже к такому варианту больше склоняюсь. Вот только скрипт бы сделать оптимальным. И по возможности без использования курсоров.

Какой курсор ?
Сначала один DELETE
Потом один INSERT
Только вот поля в INSERT лучше все равно перечислять.
4 апр 12, 16:55    [12365800]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31991
harisma
Собственно можно было бы и через UPDATE это решить, но перечислять все поля таблицы и присваивать им значения из источника - как-то нерационально...
В смысле??? Это в T-SQL синтаксис такой, да и у любого другого языка.

Это очень рационально, а если лень, то в SSMS есть для этого средства генерации текста (правой кнопкой на таблице, скрипт, апдэйт)
4 апр 12, 17:04    [12365886]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
harisma
Member

Откуда:
Сообщений: 243
У меня в общем получился вот такой скрипт (все происходит в контексте базы master):
DELETE FROM [destdb].DBO.MyTable
WHERE (RECID IN (SELECT O.RECID FROM [Sourcedb].DBO.MyTable as O))

INSERT INTO [destdb].DBO.MyTable
  SELECT * FROM [Sourcedb].DBO.MyTable as OLD


PS: Ключевое поле у таблицы - RecID

Все ли правильно?
4 апр 12, 17:12    [12365964]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
harisma
Все ли правильно?
insert без перечисления полей и с звездой - воот такая грабля. И по голове обязательно стукнет.

Ну и merge будет тупо быстрее, особенно если большую часть не надо даже апдейтить.

Так что все не правильно.

Сообщение было отредактировано: 4 апр 12, 17:15
4 апр 12, 17:15    [12365997]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
harisma
Member

Откуда:
Сообщений: 243
alexeyvg
harisma
Собственно можно было бы и через UPDATE это решить, но перечислять все поля таблицы и присваивать им значения из источника - как-то нерационально...
В смысле??? Это в T-SQL синтаксис такой, да и у любого другого языка.

Это очень рационально, а если лень, то в SSMS есть для этого средства генерации текста (правой кнопкой на таблице, скрипт, апдэйт)


Все что вы написали здесь - верно, но при условии, если этот скрипт пишется в SSMS и если знаешь названия всех полей таблицы. В моем же случае, все это делается из Дельфи, причем скрипт формируется динамически и на момент формирования скрипта я имею только имя таблицы, имя баз из какой и в какую копировать и режим копирования. Я в этот момент понятия не имею о списке полей в этой таблице и взять мне их негде.
4 апр 12, 17:16    [12366002]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
harisma
Я в этот момент понятия не имею о списке полей в этой таблице и взять мне их негде.
Откройте для себя information_schema.columns.
4 апр 12, 17:17    [12366011]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104751
harisma
Я в этот момент понятия не имею о списке полей в этой таблице и взять мне их негде

Первое утверждение верно, а второе - нет
4 апр 12, 17:17    [12366023]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
harisma
Member

Откуда:
Сообщений: 243
Гавриленко Сергей Алексеевич
insert без перечисления полей и с звездой - воот такая грабля. И по голове обязательно стукнет.

Ну и merge будет тупо быстрее, особенно если большую часть не надо даже апдейтить.


В общем, вы правы, но:
1. По предустановкам для выполнения данного скрипта, структуры таблиц в обеих базах ОДИНАКОВЫ.
2. MERGE в SQL 2000 еще не было, так что использовать его я не могу в принципе. И не потому, что у меня до сих пор стоит SQL 2000 (я себе уже даже SQL 2012 поставил), а потому что у клиентов, которые используют нашу программу, еще даже SQL 7.0 встречается.
4 апр 12, 17:21    [12366061]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
harisma,

а RecID у вас не identity случаем? а то мало ли
4 апр 12, 17:44    [12366312]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
harisma
Member

Откуда:
Сообщений: 243
Shakill
harisma,

а RecID у вас не identity случаем? а то мало ли


Нет. Не идентити. Но генерится специальным генератором на основе GUID уникальным образом.
4 апр 12, 17:47    [12366327]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
harisma
Shakill
harisma,
а RecID у вас не identity случаем? а то мало ли

Нет. Не идентити. Но генерится специальным генератором на основе GUID уникальным образом.


и неважно тогда.
в случае, когда в таблицах много совпадающих ключей, delete + insert повлечет масштабное удаление и вставку. скорее всего, update + insert будут быстрее
4 апр 12, 18:10    [12366503]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
harisma
Member

Откуда:
Сообщений: 243
[quot Shakillъ
в случае, когда в таблицах много совпадающих ключей, delete + insert повлечет масштабное удаление и вставку[/quot]
А если на операцию удаления и вставки триггеры отключить?
4 апр 12, 19:22    [12366939]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
harisma
А если на операцию удаления и вставки триггеры отключить?
Да при чем здесь триггеры? Если у вас 90% записей в таблицах идентичны, то merge или update ничего делать не будут. А вашим delete'ом вы их сначала героически будете удалять, а потом insert'ом героически заливать. Нафига эта лишняя работа для сервера? Он ее должен выполнять только потому, что вам лень написать правильный код?

Сообщение было отредактировано: 4 апр 12, 19:27
4 апр 12, 19:26    [12366962]     Ответить | Цитировать Сообщить модератору
 Re: Скрипт на изменение содержимого таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31991
Гавриленко Сергей Алексеевич
harisma
А если на операцию удаления и вставки триггеры отключить?
Да при чем здесь триггеры? Если у вас 90% записей в таблицах идентичны, то merge или update ничего делать не будут. А вашим delete'ом вы их сначала героически будете удалять, а потом insert'ом героически заливать. Нафига эта лишняя работа для сервера? Он ее должен выполнять только потому, что вам лень написать правильный код?
Главное, что код неправильно будет работать; то, что работать медленно будет, это как бы закладывается, у них же с сиквелом не специалисты работают, значит, для бизнеса так выгодно.
4 апр 12, 20:52    [12367360]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить