Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите создать динамический INSERT plz  [new]
Gogachka
Member

Откуда:
Сообщений: 47
День добрый!
Помогите плз решить проблему:
Необходимо соединить две таблицы с одинаковыми именами, но находящиеся в разных базах данных(db_1,db_2) в третью таблицу, с аналогичным названием, но в третей базе данных(db_3). Структура одноименных таблиц одинакова во всех базах данных, но в db_3 добавлено поле, в которе должно вноситься имя оригинальной базы.
В третей базе таблицы уже построены.
Названия таблиц, которые нужно "соединить" находятся в дополнительной таблице, скажем db_3..tables_to_join
думаю воспользоваться курсором и по очереди соединять таблицы из tables_to_join, например для таблицы t1:
insert into db_3..t1 (col1,col2,db_name)
select col1,col2,'db_1' from db_1..t1
union
select col1,col2,'db_2' from db_2..t1

но как указать названия колонок для остальных таблиц?
29 ноя 09, 14:19    [7993344]     Ответить | Цитировать Сообщить модератору
 Re: Помогите создать динамический INSERT plz  [new]
iljy
Member

Откуда:
Сообщений: 8711
Gogachka,

в смысле - как указать? Списком;) А получить его - например так:
declare @schema sysname, @TableName sysname
select @schema = N'dbo', @TableName = N'spt_values'
declare @columns nvarchar(max)
set @columns= stuff((
select ',' + COLUMN_NAME from master.INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = @schema and TABLE_NAME = @TableName
for xml path('')), 1,1,'')

select @columns

Получаете в цикле курсором занчения @scheme и @TableName, получаете список столбцов - и вперед, формировать ваш insert. Только имена баз указывать правильно не забывайте
29 ноя 09, 15:39    [7993443]     Ответить | Цитировать Сообщить модератору
 Re: Помогите создать динамический INSERT plz  [new]
Gogachka
Member

Откуда:
Сообщений: 47
iljy,

Спасибо за помощь, но к сожалению не понял Ваш скрипт :( Пытался запустить и получил:
'name,number,type,low,high,status'

где именно нужно указывать название таблицы, которую нужно скопировать?
29 ноя 09, 15:52    [7993459]     Ответить | Цитировать Сообщить модератору
 Re: Помогите создать динамический INSERT plz  [new]
iljy
Member

Откуда:
Сообщений: 8711
Gogachka,

вы получили список столбцов таблицы master.dbo.spt_values. Скрипт - просто чтобы продемострировать метод получения списка столбцов, на основе списка генерируйте динамический sql с командами insert ... select ... union..., все это в цикле по именам ваших таблиц. Имя таблицы в скрипте задано в переменной @TableName, имя схемы - в переменной @schema
29 ноя 09, 16:36    [7993521]     Ответить | Цитировать Сообщить модератору
 Re: Помогите создать динамический INSERT plz  [new]
Gogachka
Member

Откуда:
Сообщений: 47
iljy,

Большое спасибо! теперь понял :)
теперь осталось соединить это все...

еще один вопрос, в первой и второй базах разный COLLATION, возможно будет проблема в объединении :( как можно это избежать в моем случае?
29 ноя 09, 17:23    [7993583]     Ответить | Цитировать Сообщить модератору
 Re: Помогите создать динамический INSERT plz  [new]
iljy
Member

Откуда:
Сообщений: 8711
Gogachka,

проблема обязательно будет. Надо приводить скрипт примерно к такому виду
select @schema = N'dbo', @TableName = N'spt_values'
declare @columns_insert nvarchar(max), @columns_select nvarchar(max)
declare @columns xml
set @columns = 
(select COLUMN_NAME + isnull(' collate ' + COLLATION_NAME, '') 'row/@insert', 
	   COLUMN_NAME 'row/@select'
from master.INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = @schema and TABLE_NAME = @TableName
for xml path(''))

set @columns_insert = STUFF(
	(
		select ',' + row.value('@insert', 'nvarchar(max)')
		from @columns.nodes('row') t(row)
		for xml path('')
	), 1,1,'')
	
set @columns_select = STUFF(
	(
		select ',' + row.value('@select', 'nvarchar(max)')
		from @columns.nodes('row') t(row)
		for xml path('')
	), 1,1,'')
	
select @columns_insert, @columns_select
@TableName в данном случае будет целевая таблица. Вы вроде говорили, что структура одинаковая, значит проблем не будет. Получите 2 списка - для insert и для select.
29 ноя 09, 17:56    [7993612]     Ответить | Цитировать Сообщить модератору
 Re: Помогите создать динамический INSERT plz  [new]
Gogachka
Member

Откуда:
Сообщений: 47
iljy,

Спасибо огромное!
30 ноя 09, 11:20    [7995387]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить