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

Откуда:
Сообщений: 32
Добрый день.

Есть следующая задача. Из таблицы делается выборка значений. Результат выборки необходимо представить в виде скрипта из построчных инсертов. Хочется сделать как-то универсально и независимо от выборки, но возникают пока совсем неразумные идеи.
Есть ли какой-нибудь более-менее человеческий способ построения этого скрипта?
23 июн 16, 12:46    [19325805]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
а каков ваш вариант реализации то ?
вам для одной и тоже таблицы или как ?
Ето вы так хотитете "дамп" с данным сделать ?
23 июн 16, 13:00    [19325901]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Den94
Member

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

Таблиц будет несколько, но не факт, что их список не изменится, поэтому хотелось бы как-то отвлечённо от конкретных таблиц.

Пробывал результат грузить во временную таблицу, доставать её структуру и на основе её курсором писать скрипт. Но возникли некоторые вещи, которые, как мне кажется можно решить правильнее чем делал я.
23 июн 16, 13:06    [19325951]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
o-o
Guest
думаю, это они так таблицу переносят в другое место, частями.
и т.к. тот, кому отдают, неспособен или не желает просто из файла, полученного выгрузкой bcp, загрузить,
ему и дают скриптом, чтобы заливал себе, нажав кнопочку в студии
23 июн 16, 13:08    [19325966]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Den94
Member

Откуда:
Сообщений: 32
o-o,

именно так
23 июн 16, 13:13    [19326003]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ну и шо тогда здесь военноего то ?
1. Читаем метадату таблицы (для шапки инсерта -1 раз).Получаем чем типа @header ='insert into tt(objID, name) values ('
2. пишем селект класса select select @header+cast( object_ID as nvarchar(10)) + ',' +name+') ,' from sys.all_objects where type ='U'
23 июн 16, 13:38    [19326144]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31816
Den94
Пробывал результат грузить во временную таблицу, доставать её структуру и на основе её курсором писать скрипт. Но возникли некоторые вещи, которые, как мне кажется можно решить правильнее чем делал я.
Ну, стандартного средства для этого в сиквеле нет.
Так что либо пишите скрипт, либо ищите готовый.
23 июн 16, 13:39    [19326151]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Den94
Member

Откуда:
Сообщений: 32
Maxx,
Ну да, спасибо. Видимо к концу недели простые решения уже не так очевидны.
23 июн 16, 13:53    [19326221]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Den94
Member

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

В первом приближении вышло как то так

SELECT TOP 10 *
INTO #TempValuesTable
FROM PEOPLE 


DECLARE 
	@object_id int,
	@InsertStr varchar(max) = '',
	@FieldsStr varchar(max) = '',
	@SQL varchar(max)

DECLARE @FieldTypes TABLE (FieldName sysname, FieldType int)
DECLARE @RESULT TABLE(FieldRow varchar(max))

SELECT TOP 1 
	@object_id = object_id
FROM tempdb.sys.tables
ORDER BY name DESC

INSERT @FieldTypes
SELECT 
	c.name,
	c.system_type_id
FROM tempdb.sys.columns c
JOIN tempdb.sys.types t ON t.system_type_id = c.system_type_id
WHERE
	object_id = @object_id

SELECT 
	@FieldsStr = @FieldsStr+IIF(@FieldsStr='','',',')+c.name,
	@InsertStr = @InsertStr+IIF(@InsertStr='','','+'',''+')+
	--приведение типов
	'CAST(ISNULL('+c.name+','''') AS varchar(255))'
	--приведение типов
FROM tempdb.sys.columns c
JOIN tempdb.sys.types t ON t.system_type_id = c.system_type_id
WHERE
	object_id = @object_id

SET @SQL = 'SELECT '+@InsertStr+' FROM #TempValuesTable'
INSERT @RESULT
(FieldRow)
EXEC (@SQL)

SET @SQL = ''

SELECT 
	@SQL = @SQL+'INSERT INTO SourceTable ('+@FieldsStr+')'+CHAR(13)+'VALUES('+FieldRow+')'+CHAR(13)+CHAR(13)
FROM @RESULT

SELECT @SQL

DROP TABLE #TempValuesTable
23 июн 16, 14:15    [19326320]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Den94
В первом приближении вышло как то так

слов нет - порадовали Вы зачем такого монтра сделали из проги в 3 строчки то ? Да еще с использованием временной таблицы то ?
23 июн 16, 14:21    [19326356]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Den94
Добрый день.

Есть следующая задача. Из таблицы делается выборка значений. Результат выборки необходимо представить в виде скрипта из построчных инсертов. Хочется сделать как-то универсально и независимо от выборки, но возникают пока совсем неразумные идеи.
Есть ли какой-нибудь более-менее человеческий способ построения этого скрипта?


Контекстное меню базы - задачи - сформировать скрипты - дополнительно - параметры формирования - только данные. По памяти пишу.
23 июн 16, 14:22    [19326359]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Владислав Колосов
Контекстное меню базы - задачи - сформировать скрипты - дополнительно - параметры формирования - только данные. По памяти пишу.

у него больше 2х таблиц,а ето уже неудобно банально
23 июн 16, 14:23    [19326366]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Den94
Member

Откуда:
Сообщений: 32
Maxx,
временная таблица для данных - ибо может быть и выбора, а не просто таблица
одна лишняя - действительно, осталась от первоначального решения, остальные - для удобства: не хочется потом разбираться в порядке апострофов в одном селекте.
Открыт для вариантов
23 июн 16, 14:31    [19326423]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
плин да шо там разбераться,у вас все к варчар 255 приводится

create table dbo.test (
    id int
  , xxx  varchar(20)
)
insert into dbo.test select 1, 'AAAA'

declare @header nvarchar(256) ='insert into NewTable('
select @header=@header +column_name +',' 
from INFORMATION_SCHEMA.COLUMNS
where table_name ='test'
order by ordinal_position

set @header  = LEFT(@header, LEN(@header) -1) +') values ('

select @header + CAST(ISNULL(id,0) as nvarchar(10)) +',''' +CAST(ISNULL(xxx, '') as nvarchar(50))+ ''')' from dbo.test

drop table dbo.test
23 июн 16, 14:38    [19326474]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8485
Maxx
Владислав Колосов
Контекстное меню базы - задачи - сформировать скрипты - дополнительно - параметры формирования - только данные. По памяти пишу.

у него больше 2х таблиц,а ето уже неудобно банально


Там можно галки на всех нужных таблицах поставить. На регулярной основе сам способ такого преставления импорта не слишком хорош.
23 июн 16, 14:43    [19326499]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Да , ему просто лень
Тут если поиск спросить - то 2 стр ответов есть
23 июн 16, 14:45    [19326508]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Den94
Member

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

не работает Ваш скрипт, стоит только сменить таблицу. Но всё равно спасибо
23 июн 16, 14:46    [19326515]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Den94
Maxx,

не работает Ваш скрипт, стоит только сменить таблицу. Но всё равно спасибо



о да.... сие аргумент...
23 июн 16, 14:49    [19326527]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Владислав Колосов
Member

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

за скрипты, которые работают при смене таблиц, люди обычно деньги платят :) А бесплатны только советы.
23 июн 16, 14:52    [19326550]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3692
Maxx
Владислав Колосов
Контекстное меню базы - задачи - сформировать скрипты - дополнительно - параметры формирования - только данные. По памяти пишу.

у него больше 2х таблиц,а ето уже неудобно банально

Все правильно Владислав сказал. Эта функциональность доступна также и в программном режиме, см SMO
http://stackoverflow.com/questions/13233982/get-sql-servers-data-using-smo
23 июн 16, 18:41    [19327687]     Ответить | Цитировать Сообщить модератору
 Re: Построчный Insert  [new]
Maxx
Member [скрыт]

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

я вам больше скажу черз SMO пример даже в Факе форума есть
24 июн 16, 12:51    [19331066]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить