Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 insert exec temp table  [new]
well_valentin
Member

Откуда: Vancouver
Сообщений: 14
есть вот такое решение но оно не подходит ибо процедура может вернуть 3 и может вернуть 10 полей
Create table #temp
	(
	  PlayerId int,
	  BrandId int,
	  PlayerTypeId tinyint
	)
	
	INSERT #temp
	exec GetPlayerDataById 123

использование OPENROWSET не оправданно расточительно.

какие есть еще варианты решения.

спасибо
27 окт 11, 20:08    [11512183]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Написать процедуру, которая перед запуском GetPlayerDataById будет вычислять структуру временной таблицы и создавать её. Динамический SQL - самый лучший вариант.
27 окт 11, 20:14    [11512207]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
Glory
Member

Откуда:
Сообщений: 104751
well_valentin
ибо процедура может вернуть 3 и может вернуть 10 полей

А как вы будете работать с неизвестным результатом ?
27 окт 11, 20:37    [11512294]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
well_valentin
Member

Откуда: Vancouver
Сообщений: 14
Glory,

а кто отменил sysobjects
27 окт 11, 21:39    [11512564]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
well_valentin
Member

Откуда: Vancouver
Сообщений: 14
well_valentin,

или INFORMATION_SCHEMA.COLUMNS
27 окт 11, 21:41    [11512568]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
well_valentin
Glory,

а кто отменил sysobjects
И как же там узнать логический смысл полей таблицы?
27 окт 11, 21:41    [11512569]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
well_valentin
Member

Откуда: Vancouver
Сообщений: 14
iap,

select * from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'table name ';
27 окт 11, 21:42    [11512573]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
Glory
Member

Откуда:
Сообщений: 104751
well_valentin
а кто отменил sysobjects

Т.е. весь остальной код работы с результатом будет генерироваться динамически ?
И что вы будете генерировать, если вдруг в результате появяться 11 полей ? Или 7 ?
27 окт 11, 21:42    [11512575]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
iap
Member

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

и, кстати, там нет ничего о резалтсете, возвращаемом процедурой
27 окт 11, 21:43    [11512576]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
well_valentin
iap,

select * from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = 'table name ';
Ну и что? Имена полей таблицы (а не возвращаемого процедурой результата!) Вы узнаете.
А дальше?
27 окт 11, 21:44    [11512581]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
well_valentin
Member

Откуда: Vancouver
Сообщений: 14
Glory,

мне нужно найти поля определенного имени.

обьяснюсь сделал екзекютион в таблицу а завтро ктото добавил поля в таблицы которые выводит экзек.
я не могу менять запрос.
както динамически надо создавать
27 окт 11, 21:45    [11512585]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
iljy
Member

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

мне нужно найти поля определенного имени.

обьяснюсь сделал екзекютион в таблицу а завтро ктото добавил поля в таблицы которые выводит экзек.
я не могу менять запрос.
както динамически надо создавать

Ну вот пусть кто-то, который добавил поля в таблицы, динамически добавит их и во временные.
27 окт 11, 21:51    [11512604]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
Glory
Member

Откуда:
Сообщений: 104751
well_valentin
обьяснюсь сделал екзекютион в таблицу а завтро ктото добавил поля в таблицы которые выводит экзек.
я не могу менять запрос.

а послезавтра кто-то переименовал процедуру
И вам придется менять запрос
27 окт 11, 21:52    [11512607]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Ситуация вполне реальная, если в процедуре используется перекрёстный запрос.

- Не подскажете, как пройти на Дерибасовскую?
- А зачем Вам туда нужно?
28 окт 11, 09:54    [11513776]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
iljy
Member

Откуда:
Сообщений: 8711
Jovanny
Ситуация вполне реальная, если в процедуре используется перекрёстный запрос.

- Не подскажете, как пройти на Дерибасовскую?
- А зачем Вам туда нужно?

Ага, вот только результаты перекрестных запросов как правило нужны пользователю, а обрабатывать данные на порядок удобнее и правильнее в виде столбцов. Так что, изобретательно создавая себе трудности, не стоит удивляться их появлению. Есть простые правила, которые надо соблюдать. Например - для получения рекордсетов, могущих потребовать серверной обработки, надо использовать функции (если очень уж хочется, потом моно обернуть их процедурами). Иначе потом начинается- "ах, мне сервер сказал, что INSERT... EXEC вложенным быть не может, горе-горе!" А уж серверная обработка рекордсетов неизвестной структуры - это вообще кусок прикола.
28 окт 11, 10:08    [11513841]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
Jovanny
Member

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

Целиком согласен, и сам никогда так не делаю. Но человек спросил, получил ответ как решить. А через какое-то время сам придёт к нужным выводам.
28 окт 11, 13:51    [11515693]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
well_valentin
Member

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

да я подумывал о функции. попробую. но вообще странно почему нет динамического создания таблицы с exec как с select

только что пришла другая идея я оберну процедуру в промежуточную которая будут возвращать только те поля что мне нужны и никакие больше.
или лучше просто в виде функции сделать. хм... надо пробовать
спасибо всем
30 окт 11, 14:04    [11522378]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
Glory
Member

Откуда:
Сообщений: 104751
well_valentin
ли лучше просто в виде функции сделать. хм... надо пробовать

Табличная функция имеет заранее декларированную структуру возвращаемого набора
30 окт 11, 18:34    [11522948]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
как вариант
Guest
well_valentin,

можно и имя временной таблицы, и список нужных полей передавать в саму процедуру.
с ее автором договориться чтобы при наличии этих параметров не резалтсет выплевывал, а делал инсерт в указанную таблицу или хотя бы селект с правильным набором полей делал.
30 окт 11, 18:37    [11522951]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
iljy
Member

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

да я подумывал о функции. попробую. но вообще странно почему нет динамического создания таблицы с exec как с select

Потому что процедура в принципе может возвращать несколько рекордсетов разной структуры. Также она может возвращать рекордсеты, полученные в результате выполнения динамического запроса, т.е. когда структура на этапе компиляции не известна в принципе. И что серверу делать? А с функцией все просто - рекордсет один и его структура при компиляции известна.
30 окт 11, 21:56    [11523332]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
Начинающий SQL 2008
Member

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

-- Кидаем во временную таблицу
select * into #t from openrowset('SQLNCLI', 'Server=MyServer;Trusted_Connection=yes;', 'exec msdb.dbo.sp_help_job')

-- Узнать название полей #t
SELECT * FROM tempdb.sys.columns
WHERE object_id = OBJECT_ID('tempdb..#t')
31 окт 11, 12:22    [11525547]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
Glory
Member

Откуда:
Сообщений: 104751
Начинающий SQL 2008
well_valentin,

-- Кидаем во временную таблицу
select * into #t from openrowset('SQLNCLI', 'Server=MyServer;Trusted_Connection=yes;', 'exec msdb.dbo.sp_help_job')

А теперь тоже самое, но для exec GetPlayerDataById @myparam
31 окт 11, 12:41    [11525697]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
Glory,
через динамический SQL, примерно как здесь
31 окт 11, 15:40    [11527410]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
Glory
Member

Откуда:
Сообщений: 104751
Начинающий SQL 2008
Glory,
через динамический SQL, примерно как здесь

Ага. Особенно круто будет в динамическом запросе смотреться создание временной таблицы.
31 окт 11, 15:48    [11527504]     Ответить | Цитировать Сообщить модератору
 Re: insert exec temp table  [new]
Начинающий SQL 2008
Member

Откуда:
Сообщений: 438
Glory,
я не знаю какой у автора механизм формирования строки типа
exec GetPlayerDataById 123

Возможно
select * into #t from openrowset('SQLNCLI', 'Server=MyServer;Trusted_Connection=yes;', 'exec GetPlayerDataById 123')
или
select * into #t from openrowset('SQLNCLI', 'Server=MyServer;Trusted_Connection=yes;', 'exec GetPlayerDataById 345')
сформирует клиентское приложение.


Или использовать для этой цели постоянную таблицу, и в динамический SQL вместо
select * into #t from openrowset ...

делать что-то вроде:
if object_id('MyUniqueTableName', 'u') is not null drop table MyUniqueTableName

select * into MyUniqueTableName from openrowset('SQLNCLI', 'Server=MyServer;Trusted_Connection=yes;', 'exec msdb.dbo.sp_help_job')
31 окт 11, 16:06    [11527671]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить