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

Откуда: Бобруйск
Сообщений: 334
есть приемы, которые извлекают датасет во временную таблице, например как

select 
f1,
f2, 
f3...
into #tmp
from myTable
и тогда в #tmp я получу аналогичный датасет.

можно например также делать для процедуры
declare @table table (f1 int, f2 varchar(10), f3 datetime)
insert into @table
exec myProc

в первом случае не нужно заморачиваться с объявлением или созданием таблицы и полей к ним и тем более их типизировать.

во втором случае нужно создать таблицу и типизировать поля к заведомо известному датасету возвращаемому от процедуры

а можно ли как-то совместить эти два метода?

т.е. я хотел бы что-то вроде

exec myProc
into #tmp

и не зависимо от того сколько и каких типов поля в датасете мне вернет процедура???
спасибо
21 окт 10, 09:39    [9646314]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
а если процедура вернет более одного рекордсмена?
21 окт 10, 10:00    [9646436]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
в моем случае это один
21 окт 10, 10:02    [9646454]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Как вариант, пускай процедура сама делает инсерт во временную таблицу (select into), а наружу выдает имя временной таблицы. Тут все утыкается в баланс между (шашечки) универсальностью и конкретикой (ехать). Чувствую, если реализовывать универсальные шашечки без динамического sql не обойтись. А это не всегда удобно.
21 окт 10, 10:11    [9646512]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 334
ambarka_max,

понятно, значит я выбираю ехать.
суть сей басни то какова. что у меня есть две процедуры. обе возвращают предположительно одинаковые наборы данных. но разная описательная чать.
те. есть некоторые поля, являющиеся ключевыми, и есть поля описательные.
хотелось в конечном итоге, откинуть описательную часть обоих процедур (обе процедуры возвращают разные датасеты, разный набор полей и описательная чать обрабатывается кейсами и прочими канкатанированием)
итак. из 100 полей оного датасета, хотелось извлеч два поля с идами
из 250 полей второго датасета извлечь теже поля с идами и сделать сравнения

грубо говоря так бы выглядело

insert into #t1
exec my_proc1
(100 field fetched)

insert into #t2
exec my_proc2
(250 field fetched)

select id_f1, id_f2 from #t1
intersect
select id_f1, id_f2 from #t2

и я получил бы своё счастье
а так я обречен на массу гемору...
досадно что нет такой вот конструкции
21 окт 10, 10:25    [9646644]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
ambarka_max
Как вариант, пускай процедура сама делает инсерт во временную таблицу (select into), а наружу выдает имя временной таблицы.
А Вы в курсе, что при завершении процедуры временные таблицы, созданные в ней, автоматически дропаются?
21 окт 10, 11:18    [9647159]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
Komil_
Member

Откуда: Ташкент
Сообщений: 304
Двоичник,

Где-то я читал что через OPENROWSET можно получить данные из процедуры не извлекая предварительно во временные таблицы вне зависимости от версии сервера!!!
Примерно так:
SELECT * FROM OPENROWSET('SQLOLEDB',
'SERVER=ЗдесьНазваниеСервера;DSN=НазваниеDSN;TRUSTED_CONNECTION=YES;',
'EXECUTE MyProc(@Param=100);')

Соответственно можно ли попробовать так? Честно скажу, сам не пробовал (ибо не люблю конструкцию SELECT ... INTO Tbl FROM ...).
SELECT * #Tmp FROM OPENROWSET('SQLOLEDB',
'SERVER=ЗдесьНазваниеСервера;DSN=НазваниеDSN;TRUSTED_CONNECTION=YES;',
'EXECUTE MyProc(@Param=100);')

Здесь на всякий случай вместо #Tmp рекомендую использовать ##Tmp. Так, на всякий случай! А когда уже временная таблица не нужна следует добавить DROP TABLE.
21 окт 10, 11:28    [9647273]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
iap
ambarka_max
Как вариант, пускай процедура сама делает инсерт во временную таблицу (select into), а наружу выдает имя временной таблицы.
А Вы в курсе, что при завершении процедуры временные таблицы, созданные в ней, автоматически дропаются?


Я вроде бы в курсе...
create procedure pr_test1 @outname sysname output 
as
begin
	if (object_id('tempdb..##outtable') is not null) drop table ##outtable
	select 1 as id, 2 as value into ##outtable
	set @outname = '##outtable'
end
go

declare @temptablename sysname
declare @sql nvarchar(4000)

exec pr_test1 @temptablename output

select @sql = 'select * from '+@temptablename+' drop table '+@temptablename
exec (@sql)

go

drop procedure pr_test1
go
21 окт 10, 13:14    [9648627]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
iljy
Member

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

ага, глобальную временную таблицу так использовать - офигенная мысль. А что будет при работе нескольких соединений?
21 окт 10, 13:18    [9648671]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
CREATE procedure myproc as 
begin
 select 'return' as f1, 'my' as f2, 'value' as f3, 1 as f4, getdate() as f5
end
 
 IF OBJECT_ID('#tmp') IS NULL
DROP TABLE #tmp 
go

SELECT a.* INTO #tmp 
FROM OPENROWSET
('SQLOLEDB','Server=ServerName\InstanceNmae;Database=DataBaseName;Trusted_Connection=yes;Integrated Security=SSPI;',
 'EXEC dbo.myproc') AS a
 
SELECT * FROM #tmp

так вот вроде
21 окт 10, 14:01    [9649212]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
iljy
ambarka_max,

ага, глобальную временную таблицу так использовать - офигенная мысль. А что будет при работе нескольких соединений?


локальную-глобальную.
молодой человек, что-то вы совсем нам мозг запутали.

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

физически они называются
dbo.#76384129
dbo.#7DA458C7
dbo.#7ECD872A
dbo.#7F8CA139
dbo.#7FC1AB63
хотя клиенту они видны как #tmp
и у каждого своя.
21 окт 10, 14:05    [9649248]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
Glory
Member

Откуда:
Сообщений: 104751
SHKoder

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

BOL

Temporary tables are automatically dropped when they go out of scope, unless explicitly dropped by using DROP TABLE:

- A local temporary table created in a stored procedure is dropped automatically when the stored procedure is finished. The table can be referenced by any nested stored procedures executed by the stored procedure that created the table. The table cannot be referenced by the process that called the stored procedure that created the table.


- All other local temporary tables are dropped automatically at the end of the current session.
21 окт 10, 14:12    [9649322]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
Glory,

Уважаемый, а как же это???
 IF OBJECT_ID('#tmp') IS NULL
DROP TABLE #tmp 
GO

CREATE PROCEDURE myproc 
AS 
BEGIN
	UPDATE #tmp
	SET b = 'A',
		c = getdate()
	WHERE a%2 = 1  
END
GO

 ;WITH cte (a, b, c) AS (
 SELECT 1, 'x', GETDATE() UNION ALL
 SELECT 2, 'y', GETDATE() UNION ALL
 SELECT 3, 'z', GETDATE() 	
 )
 
 SELECT a, b, c 
 INTO #tmp
 FROM cte
 
 SELECT * FROM #tmp
 
 EXEC myproc
 GO
 
 SELECT * FROM #tmp
 
 DROP PROCEDURE myproc 
 go

я не поленился, но налабал таки фрагмент кода...
или мы сейчас говорим о разном?. контекст выше был именно об этом.
21 окт 10, 15:21    [9650187]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Уважаемый, а как же это???

я детальней выделю:
A local temporary table created in a stored procedure is dropped automatically when the stored procedure is finished

Posted via ActualForum NNTP Server 1.4

21 окт 10, 15:23    [9650209]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
SHKoder
Member

Откуда: Moscow city
Сообщений: 616
daw,

аха, спасип. видимо говорим о разном. но на будущее я себе запомнил.
спасибо
21 окт 10, 15:56    [9650644]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: датасет во временной динамической таблице  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
C глобальной временной таблицей (##) я погорячился, признаю.
5 апр 13, 11:12    [14139073]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Трындец,за последнюю неделю - 3-я аналогичная тема,ето что новый стиль писать на T-SQL такой ?
5 апр 13, 11:16    [14139113]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
мимо
Guest
ambarka_max
C глобальной временной таблицей (##) я погорячился, признаю.

Может ещё стоит подумать..
5 апр 13, 11:17    [14139119]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
мимо
ambarka_max
C глобальной временной таблицей (##) я погорячился, признаю.

Может ещё стоит подумать..

Через 2 года
5 апр 13, 11:22    [14139144]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Maxx
Трындец,за последнюю неделю - 3-я аналогичная тема,ето что новый стиль писать на T-SQL такой ?

А вы про новый стиль (вообще то он старый) из какого сообщения говорите? Давайте конкретную критику )
5 апр 13, 11:32    [14139212]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
Maxx
Member [скрыт]

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

Где Вы увидели критику то ? Я про ,что всем срочно потребовалось получать датасеты их ХП которые используют времянки..прямо нашествие желающих на етой неделе
5 апр 13, 11:36    [14139239]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Maxx
ambarka_max,

Где Вы увидели критику то ? Я про ,что всем срочно потребовалось получать датасеты их ХП которые используют времянки..прямо нашествие желающих на етой неделе


Ну вот мне лично опять понадобилось недавно, ради унификации.

Напомнило, перефразирую:
Ведь, если рекордсеты получают - значит - это кому-нибудь нужно? Значит - это необходимо, чтобы каждый вечер из процедуры возвращался хоть один рекордсет?! :)
5 апр 13, 11:51    [14139329]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
Гость333
Member

Откуда:
Сообщений: 3683
ambarka_max
Значит - это необходимо, чтобы каждый вечер из процедуры возвращался хоть один рекордсет?! :)

А рекордсмены с какой частотой должны возвращаться?
ambarka_max
а если процедура вернет более одного рекордсмена?
5 апр 13, 12:44    [14139758]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
Cammomile
Member

Откуда:
Сообщений: 1214
Коллега топикстартер, давайте уточним какова именно ваша проблема? Вы не хотите переписывать код процедур? Вы не хотите создавать таблицы т.к. у вас динамически начитываются поля? Вам критично использование именно временной таблицы?
5 апр 13, 15:20    [14140946]     Ответить | Цитировать Сообщить модератору
 Re: датасет во временной динамической таблице  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Cammomile
Коллега топикстартер, давайте уточним какова именно ваша проблема? Вы не хотите переписывать код процедур? Вы не хотите создавать таблицы т.к. у вас динамически начитываются поля? Вам критично использование именно временной таблицы?
Это послание в далёкую дождливую осень 2010 года?
Двоиечник давно исправился, наверно.
5 апр 13, 15:41    [14141103]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить