У вас ніколи не виникало бажання сказати MS SQL
і він би просто її скопіював? Не так, що ви перерахували всі стовпці в блоках INSERT і SELECT. Навпаки, ви написали: будь ласка, скопируй. Було б чудово? І якщо раптом зміниться схема таблиці, вам не довелося перераховувати ще один стовпець.
Пардон, він сказав, що заважає унікальний індекс. Добре. На цей раз попросимо ввічливіше:
От і все. MSSQL тільки що скопіював рядок таблиці, і нам не довелося вказувати стовпці в INSERT або SELECT. Часом це буває дуже корисно.
Якщо вам не терпиться повторити, шукайте інструкції в кінці сторінки.
Ми зберігаємо схеми таблиць в особливій таблиці в нашій 'системної' базі даних. Коли настає потрібний момент, ми можемо витягти набір стовпців у вигляді текстового перерахування, тобто col1, col2, col3 і створити динамічний запит, зліпив рядки на кшталт INSERT INTO і НАША_ТАБЛІЦА і (col1, col2, col3) і SELECT і col1, col2, col3 і FROM і НАША_ТАБЛІЦА і WHERE $ IDENTITY = і OUR_PRODUCT_ID_VALUE. Більш того, якщо потрібно змінити деякі дані для нової строї, ми просто замінюємо назви деяких стовпців colN явними значеннями, наприклад SELECT col1, 'new value', col3 FROM НАША_ТАБЛІЦА.
Як тільки ми отримали запит, ми його виконуємо, і відбувається магія.
Якщо вас цікавить, як вона влаштована - прошу просимо.
вимоги
Скрипт має на увазі роботу з регулярними виразами, агрегаційної функцією конкатенації і масивами. Потрібна для цього CLR DLL розміщена тут.
Зберігаємо схеми таблиць в одному місці
Якщо ви знайомі з попереднім записом. ви помітите, що замість відображення стовпців окремо взятої таблиці, ми зберігаємо схеми всіх таблиць всіх баз даних без винятку.
Так ми збережемо схеми таблиць.
Ми створюємо тимчасову таблицю і зберігаємо в ній інформацію про нашу робочої таблиці (тієї самої, де копіюємо). Ми також визначаємо стовпець IDENTITY. Потім ми готуємо суфікс і префікс (LITERAL_PREFIX і LITERAL_SUFFIX) на випадок нових явних значень. Наприклад, INSERT INTO table (int_col, varchar_col, varbinary_col) SELECT 1, 'text', 0xCA010. Символи '' і 0x якраз ними і є. Ми поділяємо масив @todo (наприклад, a = 10; b = new text; c = value) в таблицю, щоб створити пари ключ => значення. В останній таблиці ми підміняємо назви колонок на передані нові значення. Інші стовпці залишаються перечісілени без змін.
Заключний крок - зібрати запит, використовую функцію агрегації SYSDB.dbo.list.
Якщо ви бажаєте повторити описану функціональність, необхідно виконати чотири кроки:
- Створити 'системну' базу даних. Я назвав її SYSDB;
- Підключити функції CLR звідси;
- Запустити скрипти:
- Зберегти інформацію про типах даних;
- Створити і виконати процедуру поновлення схем таблиць.
- Створити процедуру для копіювання рядка.
- Користуватися.