2016-10-27 2 views
0

Кто-нибудь видел какой-либо образец кода SQL Server для «общего» добавления записей с использованием нескольких таблиц?Добавление к нескольким таблицам

У нас есть странный процесс здесь, где мы используем набор из около десятка таблиц «текущих» данных и соответствующий набор таблиц с «предыдущими» данными (я знаю, что есть лучшие способы сделать это, но это с чем мне приходится иметь дело).

Мне нужно переместить записи каждую неделю из набора «текущих» таблиц в свои «предыдущие» таблицы сопоставлений, но я не хочу создавать серию инструкций INSERT INTO отдельно для каждой таблицы со всеми полями, жесткими - закодированы для каждого.

Спасибо!

+0

Некоторые виды репликации/синхронизации? – jarlh

+0

Это [этот скрипт] (http://stackoverflow.com/a/2179622/87698) что вы ищете? – Heinzi

+1

Возможный дубликат [Как скопировать все поля одной таблицы в другую, более широкую таблицу в SQL Server 2005 Express?] (Http://stackoverflow.com/questions/2179463/how-can-i-copy-all-fields -of-one-table-to-another-wide-table-in-sql-server-200) – Heinzi

ответ

1

Следующий сценарий будет создавать инструкции INSERT динамически на основе «таблицы имен таблиц». Это будет? Однако он не учитывает имя базы данных источника или целевую базу данных, но я уверен, что вы можете адаптировать сценарий, если вам это нужно.


CREATE TABLE #table_of_tables(
    src_table_name SYSNAME NOT NULL PRIMARY KEY, 
    dest_table_name SYSNAME NOT NULL 
); 
--INSERT INTO #table_of_tables(src_table_name,dest_table_name)VALUES('src_table','dest_table'); 

DECLARE @copy_stmts NVARCHAR(MAX) = (
    SELECT 
     ';INSERT INTO ' + QUOTENAME(dest_table_name) + '('+cols+') SELECT ' + cols + ' FROM ' + QUOTENAME(src_table_name) 
    FROM 
     (
      SELECT 
       tot.src_table_name, 
       tot.dest_table_name, 
       cols=STUFF(
        (SELECT ','+QUOTENAME(c.COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS AS c WHERE c.TABLE_NAME=t.TABLE_NAME FOR XML PATH('')), 
        1, 
        1, 
        '' 
       ) 
      FROM 
       #table_of_tables AS tot 
       INNER JOIN INFORMATION_SCHEMA.TABLES AS t ON 
        t.TABLE_NAME=tot.src_table_name AND 
        t.TABLE_TYPE='BASE TABLE' 
     ) AS tbd 
    FOR 
     XML PATH('') 
); 

--SELECT @copy_stmts; --> select to verify statements 
EXEC sp_executesql @copy_stmts; --> to launch the insert statements 

DROP TABLE #table_of_tables; 
Смежные вопросы