Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Den94 Member Откуда: Сообщений: 32 |
Добрый день. Есть следующая задача. Из таблицы делается выборка значений. Результат выборки необходимо представить в виде скрипта из построчных инсертов. Хочется сделать как-то универсально и независимо от выборки, но возникают пока совсем неразумные идеи. Есть ли какой-нибудь более-менее человеческий способ построения этого скрипта? |
23 июн 16, 12:46 [19325805] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
а каков ваш вариант реализации то ? вам для одной и тоже таблицы или как ? Ето вы так хотитете "дамп" с данным сделать ? |
23 июн 16, 13:00 [19325901] Ответить | Цитировать Сообщить модератору |
Den94 Member Откуда: Сообщений: 32 |
Maxx, Таблиц будет несколько, но не факт, что их список не изменится, поэтому хотелось бы как-то отвлечённо от конкретных таблиц. Пробывал результат грузить во временную таблицу, доставать её структуру и на основе её курсором писать скрипт. Но возникли некоторые вещи, которые, как мне кажется можно решить правильнее чем делал я. |
23 июн 16, 13:06 [19325951] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
думаю, это они так таблицу переносят в другое место, частями. и т.к. тот, кому отдают, неспособен или не желает просто из файла, полученного выгрузкой bcp, загрузить, ему и дают скриптом, чтобы заливал себе, нажав кнопочку в студии |
23 июн 16, 13:08 [19325966] Ответить | Цитировать Сообщить модератору |
Den94 Member Откуда: Сообщений: 32 |
o-o, именно так |
23 июн 16, 13:13 [19326003] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31816 |
Так что либо пишите скрипт, либо ищите готовый. |
||
23 июн 16, 13:39 [19326151] Ответить | Цитировать Сообщить модератору |
Den94 Member Откуда: Сообщений: 32 |
Maxx, Ну да, спасибо. Видимо к концу недели простые решения уже не так очевидны. |
23 июн 16, 13:53 [19326221] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
слов нет - порадовали ![]() |
||
23 июн 16, 14:21 [19326356] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
Контекстное меню базы - задачи - сформировать скрипты - дополнительно - параметры формирования - только данные. По памяти пишу. |
||
23 июн 16, 14:22 [19326359] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
у него больше 2х таблиц,а ето уже неудобно банально |
||
23 июн 16, 14:23 [19326366] Ответить | Цитировать Сообщить модератору |
Den94 Member Откуда: Сообщений: 32 |
Maxx, временная таблица для данных - ибо может быть и выбора, а не просто таблица одна лишняя - действительно, осталась от первоначального решения, остальные - для удобства: не хочется потом разбираться в порядке апострофов в одном селекте. Открыт для вариантов |
23 июн 16, 14:31 [19326423] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
Там можно галки на всех нужных таблицах поставить. На регулярной основе сам способ такого преставления импорта не слишком хорош. |
||||
23 июн 16, 14:43 [19326499] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
Да , ему просто лень Тут если поиск спросить - то 2 стр ответов есть |
23 июн 16, 14:45 [19326508] Ответить | Цитировать Сообщить модератору |
Den94 Member Откуда: Сообщений: 32 |
Maxx, не работает Ваш скрипт, стоит только сменить таблицу. Но всё равно спасибо |
23 июн 16, 14:46 [19326515] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
о да.... сие аргумент... |
||
23 июн 16, 14:49 [19326527] Ответить | Цитировать Сообщить модератору |
Владислав Колосов Member Откуда: Сообщений: 8485 |
Den94, за скрипты, которые работают при смене таблиц, люди обычно деньги платят :) А бесплатны только советы. |
23 июн 16, 14:52 [19326550] Ответить | Цитировать Сообщить модератору |
Arm79 Member Откуда: МО, Раменское Сообщений: 3692 |
Все правильно Владислав сказал. Эта функциональность доступна также и в программном режиме, см SMO http://stackoverflow.com/questions/13233982/get-sql-servers-data-using-smo |
||||
23 июн 16, 18:41 [19327687] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
Arm79, я вам больше скажу черз SMO пример даже в Факе форума есть |
24 июн 16, 12:51 [19331066] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |