Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вставить результат запроса в новую таблицу  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2395
Lexx_SQL,

 
insert into t (path)
select @dir+dir path
from #t


непонятно из вопроса, что вам непонятно )
17 авг 15, 17:44    [18030057]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
o-o
Guest
ТС получил список подкаталогов,
а хочет, видимо, выполнить xp_subdirs уже для каждого из полученных подкаталогов,
и чтоб результат каждой выборки в отдельную таблицу лег.
курсор, короче
17 авг 15, 19:54    [18030536]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
Lexx_SQL
Member

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

на самом деле это просто пример, запросы могут быть разные, но в конечном итоге выдают какой то массив данных. Мне нужно вставить этот массив в новую таблицу. Можно ли сделать в общем виде такую надстройку к запросу?
18 авг 15, 08:58    [18031952]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31785
Lexx_SQL
Мне нужно вставить этот массив в новую таблицу
Так вы и вставляете массив в новую таблицу #t командой:
insert into #t exec xp_subdirs @dir

Что вы хотите получить, более конкретно?

Что бы на каждый запрос получалась своя таблица с данными? С именем таблицы, которое формируется по каким то вашим алгоритмам?
Пишите цикл, внутри тела цикла формируйте имя таблицы, создавайте её, выполняйте insert ... exec ... для этого имени.
18 авг 15, 09:58    [18032235]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2565
Lexx_SQL,

а TableNew должна быть постоянной или временной? Для временной просто так и пишется
SELECT t.* INTO #TableNew FROM (Запрос) t
Но в любом случае, что делать далее с неизвестной структурой?
18 авг 15, 10:34    [18032467]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
Jaffar
Member

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

помоему он просто издевается над нами.
18 авг 15, 11:21    [18032725]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
Jaffar
Member

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

Это тоже самое что сказать "У меня есть 2 ноги, вот так я хожу левой, а вот так - правой, как мне ими ходить?".
18 авг 15, 11:22    [18032734]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
Lexx_SQL
Member

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

причем тут "издевается"...
insert into #t 

это вставка во временную таблицу, а мне нужно создать в БД таблицу и вставить в нее общий результат запроса..
Есть программа, которая обрабатывает запросы. Результат запроса какие данные в табличном виде. Пример выше.
Мне нужно этот результат вставить в новую таблицу БД. Имя таблицы присваивается программно.
Я предполагаю, что лучшим вариантом было б сделать надстройку к запросу. Т.е что-то типа
SELECT t.* INTO НоваяТаблицаБД FROM (Запрос) t

Но столкнулся с проблемой, что не все запросы можно вставить в такую конструкцию. Например, запрос, который я приводил выше.
Поэтому и возник этот топик.
18 авг 15, 12:30    [18033197]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
Konst_One
Member

Откуда:
Сообщений: 11568
ну так создайте сначала таблицу CREATE TABLE ...
18 авг 15, 12:36    [18033233]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
Lexx_SQL
Member

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

еще простой рабочий пример:
SELECT t.* INTO НоваяТаблицаБД FROM (Select * from _Users) t


Так вот вместо "Select * from _Users" может быть запрос, что указан выше. И с ним это уже не работает.
18 авг 15, 12:36    [18033238]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
Konst_One
Member

Откуда:
Сообщений: 11568
SELECT t.* INTO [НоваяТаблицаБД] FROM (select * from #t) t



чем не угодил?
18 авг 15, 12:38    [18033250]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
gang
Member

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

Это не издевательство, а неумение объяснять. Там по ходу "запрос" есть нечто непостоянное, в т.ч. по составу возвращаемых полей. И хотелку можно сформулировать как "сохранение произвольного резалтсета произвольной команды в виде таблицы".
18 авг 15, 12:41    [18033264]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
Jaffar
Member

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

ну тут только распарсить ваш запрос и добавить туда into 'Table_name'


select @Query = replace (@QUEY, 'from #t', 'into Table_name from #t')
18 авг 15, 12:41    [18033269]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
o-o
Guest
капец, товарищи, до меня дошло.
ТС создает "универсальную обертку".
ему влом писать каждый раз определение таблицы,
ведь надо знать поля и их тип.
он хочет волшебную обертку:
задает имя таблицы + запрос, а "черный ящик" ему сам определяет структуру таблицы
в зависимости от его "запроса" (а "запросом" он, похоже, обзывает заодно и вызов хп)
18 авг 15, 12:45    [18033298]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
Jaffar
Member

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


как я понял "запрос" - это не просто select. а произвольный sql код который закатчивается select`ом.

что-то типа

insert...

update....

delete.....

и потом select который то и нужно сохранить в табличку.

Интересно, а несколько select`ов может быть?


В любом случае только динамическое распарсивание спасет отца русской демократии.
18 авг 15, 12:45    [18033299]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
gang
Member

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

На самом деле, лучшее что тут можно предложить - не надо так делать.
Если изврат неизбежен то посмотрите в торону OpenQuery, OpenRowSet.
18 авг 15, 12:46    [18033306]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
Jaffar
Member

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

такой подход говняковый, т.к. при увеличении размерности данных все обосрется с подливом.
18 авг 15, 12:47    [18033314]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
Lexx_SQL
Member

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

да, все верно.
Select точно один.
Распарсить тоже была мысль, но непонятно от чего иногда плясать...
18 авг 15, 12:52    [18033353]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
Lexx_SQL
Member

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

понятно, спасибо.
18 авг 15, 13:17    [18033510]     Ответить | Цитировать Сообщить модератору
 Re: Вставить результат запроса в новую таблицу  [new]
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 Ответить