SQL: вставить в оператор, но предположим, что вы не знаете заголовок источника и цели - PullRequest
1 голос
/ 27 июля 2011

Я пытаюсь придумать SQL-код вставки, который вставит данные из таблицы в другую существующую таблицу.На самом деле есть несколько способов сделать это, но я не нашел способа, который соответствовал бы моим требованиям.

Мне нужен запрос типа оператора вставки, который вставит данные в другую таблицу, но он не знает, какие заголовки обеих таблициметь.Например, исходная таблица имеет 25 заголовков, а целевая - 20, 10 из которых совпадают по названию.Я хотел бы перевести те, которые соответствуют названию заголовков, игнорируя остальные.

Надеюсь, я был ясен и надеюсь, что кто-нибудь сможет мне помочь

Ответы [ 2 ]

0 голосов
/ 27 июля 2011

Я не могу придумать ни одного запроса, который может сделать все это, но вы определенно можете написать для этого процедуру сервера sql.

вы можете получить список имен столбцов и тип данных столбцов дляисходная и целевая таблицы из следующего запроса

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'TABLENAME'

С этим вы можете запустить цикл в pl / sql, чтобы найти совпадающие столбцы на основе имени и типа данных, а затем сформировать на лету динамический plsql ивыполнить его.это должно решить вашу цель, я думаю.

0 голосов
/ 27 июля 2011

Я думаю, вам нужно получить столбцы двух таблиц, затем отфильтровать их, чтобы получить имена столбцов совпадений, после чего вы можете построить оператор insert into и выполнить его

чтобы получить столбцы в обеих таблицах

Declare @cols varchar(max)

SELECT  @cols =COALESCE(@cols +',','')+'['+COLUMN_NAME+']'
FROM DbName.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = N'security' and COLUMN_NAME in( 
      SELECT COLUMN_NAME
      FROM DbName.INFORMATION_SCHEMA.COLUMNS 
      WHERE TABLE_NAME = N'debt_securities')

затем создать оператор вставки

declare @query varchar(max)='insert into debt_securities('+@cols+')
                             select '+@cols+' from [security]'

затем выполните его

exec(@query)
...