Копіювання рядка будь-якої таблиці

У вас ніколи не виникало бажання сказати 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.

Якщо ви бажаєте повторити описану функціональність, необхідно виконати чотири кроки:

  1. Створити 'системну' базу даних. Я назвав її SYSDB;
  2. Підключити функції CLR звідси;
  3. Запустити скрипти:
    • Зберегти інформацію про типах даних;
    • Створити і виконати процедуру поновлення схем таблиць.
    • Створити процедуру для копіювання рядка.
  4. Користуватися.

Схожі статті