Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Lexx_SQL Member Откуда: Сообщений: 566 |
Добрый день! У меня есть запросы,которые в конечном итоге выдают какие-то наборы данных, например список папок: --***Запрос*** SET NOCOUNT ON; if object_id('tempdb..#t','U') is not null drop table #t create table #t (dir nvarchar(255)) declare @dir nvarchar(255)='\\S1\users' insert into #t exec xp_subdirs @dir SELECT row_number() over(order by dir) as no, dir , @dir+dir path from #t drop table #t Как можно вставить результаты этих запрос в новые отдельные таблицы. Что-то типа: SELECT * INTO [Запрос] FROM (***Запрос***) t Спасибо. |
17 авг 15, 16:49 [18029718] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2395 |
Lexx_SQL,insert into t (path) select @dir+dir path from #t непонятно из вопроса, что вам непонятно ) |
17 авг 15, 17:44 [18030057] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
ТС получил список подкаталогов, а хочет, видимо, выполнить xp_subdirs уже для каждого из полученных подкаталогов, и чтоб результат каждой выборки в отдельную таблицу лег. курсор, короче |
17 авг 15, 19:54 [18030536] Ответить | Цитировать Сообщить модератору |
Lexx_SQL Member Откуда: Сообщений: 566 |
o-o, на самом деле это просто пример, запросы могут быть разные, но в конечном итоге выдают какой то массив данных. Мне нужно вставить этот массив в новую таблицу. Можно ли сделать в общем виде такую надстройку к запросу? |
18 авг 15, 08:58 [18031952] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31785 |
insert into #t exec xp_subdirs @dir Что вы хотите получить, более конкретно? Что бы на каждый запрос получалась своя таблица с данными? С именем таблицы, которое формируется по каким то вашим алгоритмам? Пишите цикл, внутри тела цикла формируйте имя таблицы, создавайте её, выполняйте insert ... exec ... для этого имени. |
||
18 авг 15, 09:58 [18032235] Ответить | Цитировать Сообщить модератору |
Lexx_SQL Member Откуда: Сообщений: 566 |
alexeyvg, у меня есть какой-то запрос, я не знаю его содержание-это "черный ящик", но знаю , что результат-это массив данных. Например: --Запрос SET NOCOUNT ON; if object_id('tempdb..#t','U') is not null drop table #t create table #t (dir nvarchar(255)) declare @dir nvarchar(255)='\\S1\users' insert into #t exec xp_subdirs @dir SELECT row_number() over(order by dir) as no, dir , @dir+dir path from #t drop table #t Мне нужно вставить результаты этого запроса в новую таблицу БД. SELECT * INTO TableNew FROM (Запрос) t На примере данного запроса как можно это сделать? |
18 авг 15, 10:10 [18032301] Ответить | Цитировать Сообщить модератору |
PaulYoung Member Откуда: Москва Сообщений: 2565 |
Lexx_SQL, а TableNew должна быть постоянной или временной? Для временной просто так и пишется SELECT t.* INTO #TableNew FROM (Запрос) tНо в любом случае, что делать далее с неизвестной структурой? |
18 авг 15, 10:34 [18032467] Ответить | Цитировать Сообщить модератору |
StarikNavy Member Откуда: Москва Сообщений: 2395 |
Lexx_SQL, >>у меня есть какой-то запрос этот запрос? SELECT row_number() over(order by dir) as no, dir , @dir+dir path from #t >> я не знаю его содержание-это "черный ящик" не знаете какие колонки?? вы же уже результат вставляете в таблицу, командой insert into #t |
18 авг 15, 10:40 [18032510] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
StarikNavy, помоему он просто издевается над нами. |
18 авг 15, 11:21 [18032725] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
Lexx_SQL, Это тоже самое что сказать "У меня есть 2 ноги, вот так я хожу левой, а вот так - правой, как мне ими ходить?". |
18 авг 15, 11:22 [18032734] Ответить | Цитировать Сообщить модератору |
Lexx_SQL Member Откуда: Сообщений: 566 |
Jaffar, причем тут "издевается"... insert into #t это вставка во временную таблицу, а мне нужно создать в БД таблицу и вставить в нее общий результат запроса.. Есть программа, которая обрабатывает запросы. Результат запроса какие данные в табличном виде. Пример выше. Мне нужно этот результат вставить в новую таблицу БД. Имя таблицы присваивается программно. Я предполагаю, что лучшим вариантом было б сделать надстройку к запросу. Т.е что-то типа SELECT t.* INTO НоваяТаблицаБД FROM (Запрос) t Но столкнулся с проблемой, что не все запросы можно вставить в такую конструкцию. Например, запрос, который я приводил выше. Поэтому и возник этот топик. |
18 авг 15, 12:30 [18033197] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11568 |
ну так создайте сначала таблицу CREATE TABLE ... |
18 авг 15, 12:36 [18033233] Ответить | Цитировать Сообщить модератору |
Lexx_SQL Member Откуда: Сообщений: 566 |
Jaffar, еще простой рабочий пример: SELECT t.* INTO НоваяТаблицаБД FROM (Select * from _Users) t Так вот вместо "Select * from _Users" может быть запрос, что указан выше. И с ним это уже не работает. |
18 авг 15, 12:36 [18033238] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11568 |
SELECT t.* INTO [НоваяТаблицаБД] FROM (select * from #t) t чем не угодил? |
18 авг 15, 12:38 [18033250] Ответить | Цитировать Сообщить модератору |
gang Member Откуда: Сообщений: 1394 |
Jaffar, Это не издевательство, а неумение объяснять. Там по ходу "запрос" есть нечто непостоянное, в т.ч. по составу возвращаемых полей. И хотелку можно сформулировать как "сохранение произвольного резалтсета произвольной команды в виде таблицы". |
18 авг 15, 12:41 [18033264] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
Lexx_SQL, ну тут только распарсить ваш запрос и добавить туда into 'Table_name' select @Query = replace (@QUEY, 'from #t', 'into Table_name from #t') |
18 авг 15, 12:41 [18033269] Ответить | Цитировать Сообщить модератору |
Lexx_SQL Member Откуда: Сообщений: 566 |
Konst_One, а как вставить результат выполнения этого запроса: --Запрос SET NOCOUNT ON; if object_id('tempdb..#t','U') is not null drop table #t create table #t (dir nvarchar(255)) declare @dir nvarchar(255)='\\S1\users' insert into #t exec xp_subdirs @dir SELECT row_number() over(order by dir) as no, dir , @dir+dir path from #t drop table #t P.S. Эта обработка должна быть программная. Т.е. программа знает имя новой таблицы, и какой-то запрос с данными. Простые запросы обрабатываются нормально, но вот такой ,например, как выше, я не знаю что с ним делать. |
18 авг 15, 12:43 [18033282] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
капец, товарищи, до меня дошло. ТС создает "универсальную обертку". ему влом писать каждый раз определение таблицы, ведь надо знать поля и их тип. он хочет волшебную обертку: задает имя таблицы + запрос, а "черный ящик" ему сам определяет структуру таблицы в зависимости от его "запроса" (а "запросом" он, похоже, обзывает заодно и вызов хп) |
18 авг 15, 12:45 [18033298] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
gang, как я понял "запрос" - это не просто select. а произвольный sql код который закатчивается select`ом. что-то типа insert... update.... delete..... и потом select который то и нужно сохранить в табличку. Интересно, а несколько select`ов может быть? В любом случае только динамическое распарсивание спасет отца русской демократии. |
18 авг 15, 12:45 [18033299] Ответить | Цитировать Сообщить модератору |
gang Member Откуда: Сообщений: 1394 |
Lexx_SQL, На самом деле, лучшее что тут можно предложить - не надо так делать. Если изврат неизбежен то посмотрите в торону OpenQuery, OpenRowSet. |
18 авг 15, 12:46 [18033306] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
o-o, такой подход говняковый, т.к. при увеличении размерности данных все обосрется с подливом. |
18 авг 15, 12:47 [18033314] Ответить | Цитировать Сообщить модератору |
Lexx_SQL Member Откуда: Сообщений: 566 |
Jaffar, да, все верно. Select точно один. Распарсить тоже была мысль, но непонятно от чего иногда плясать... |
18 авг 15, 12:52 [18033353] Ответить | Цитировать Сообщить модератору |
Jaffar Member Откуда: Сообщений: 633 |
Lexx_SQL, да в общем случае ничего кроме синтаксического АНАЛиза не сделаешь. Если есть гарантия что FROM - используется только в select т.е. нет update... from и delete .... from - то можно просто зареплейсить "FROM" на "into Table_name from ". ну или вычислять что бы менять только те from которые идут после select и только их реплейсить. кстати select может быть вообще без FROM`а select 123 union all select 236 и. тп. Возможно для решения вашей реальной задачи лучше не заходить с заднего хода. |
18 авг 15, 12:59 [18033400] Ответить | Цитировать Сообщить модератору |
Lexx_SQL Member Откуда: Сообщений: 566 |
Jaffar, понятно, спасибо. |
18 авг 15, 13:17 [18033510] Ответить | Цитировать Сообщить модератору |
Guf Member Откуда: Новосибирск Сообщений: 658 |
Lexx_SQL, Есть такя штука SET FMTONLY Returns only metadata to the client. Can be used to test the format of the response without actually running the query. Она правда тоже не всегда спасает. В Вашем примере работать не будет, но в примере ниже может. DECLARE @sql NVARCHAR(MAX) = 'DECLARE @i INT; SELECT @i = 10; SELECT @i = @i*2; SELECT * FROM [sys].[objects] [o] WHERE [o].[object_id] <= @i;'; EXEC ('SET FMTONLY ON;' + @sql); EXEC (@sql); Если клиентское приложение может поймать пустой рекордсет, создать по нему нужную таблицу, а уже потом выполнить запрос еще раз и вставить данные в созданную таблицу. P.S. Я плохому не учил. Всё выше сказанное, исключительно в порядке бреда ![]() |
18 авг 15, 14:14 [18033977] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |