powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по local temporary table
14 сообщений из 14, страница 1 из 1
Вопрос по local temporary table
    #32072921
Andrew_azz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго дня ,

В хранимой проц P1 создается local temporary table
#my_table . Внутри хр. процедуры P1 вызывается другая хр. процедура P2 . Можно ли в P2 производить вставку записей в #my_table , а затем в P1 прочитать модифицированную #my_table ?

Т.е. речь идет о передаче данных в виде таблиц между хр. процедурами . Я так понимаю , для этого можно (удобней) использовать только локальные временные таблицы .
Заранее благодарен за ответ .
...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32072927
Фотография jimmers
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно
...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32072935
gdn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
gdn
Гость
А пропробуй глобальную ##myTab
...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32072939
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Andrew_azz
Не пробуй глобальную ##myTab. Описанный тобой метод самый правильный для сложных обработок на сервере.
...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32072942
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще с этим непонятки:
Выдержка из BOL 1:
The two types of temporary tables, local and global, differ from each other in their names, their visibility, and their availability. Local temporary tables have a single number sign (#) as the first character of their names; they are visible only to the current connection for the user; and they are deleted when the user disconnects from instances of Microsoft® SQL Server™ 2000. Global temporary tables have two number signs (##) as the first characters of their names; they are visible to any user after they are created; and they are deleted when all users referencing the table disconnect from SQL Server.

Выдержка из BOL 2:
A local temporary table created in a stored procedure is dropped automatically when the stored procedure completes. 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 which called the stored procedure that created the table.

All other local temporary tables are dropped automatically at the end of the current session.

Global temporary tables are automatically dropped when the session that created the table ends and all other tasks have stopped referencing them. The association between a task and a table is maintained only for the life of a single Transact-SQL statement. This means that a global temporary table is dropped at the completion of the last Transact-SQL statement that was actively referencing the table when the creating session ended.

Вы можете работать с временной таблицей, созданной в верхней процедуре во вложенных процедурах, но не наоборот..


У меня была другая проблема - хп1 вызывала другую хп1, где создавалась и заполнялась временная таблица , управления возвращалось в хп1, потом (после нескольких statetment'ов) хп1 вызывала снова вызывала хп2, где эта временная таблица апдейтилась.
В этом случае мне пришлось использовать глобальную временную таблицу.
Может как можно использовать локальную временную таблицу (глобальная не есть хорошо)?
...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32073041
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Makc
А какие конкретно непонятки?
Действительно, БОЛ не врёт, вы можете работать с временной таблицей, созданной в верхней процедуре во вложенных процедурах, но не наоборот.
А в описанном вами случае, действительно, нужно использовать гл. врем таблицу, хотя это не есть хорошо.
...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32073053
Фотография Белов Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Makc
В данной ситауции никак.
Только если.

1. В проц2 создается и заполняется временная таблица.
2. Результат управление передается в проц1
3. Результат из проц2 пихается во временную таблицу табл1, которая создается в проц1
4. Вызывается проц2, которая работает с временной таблицей талб1
5. В проц2 апдейтится значения в табл1

Если только таким способом.

А глобальная
А если у тебя 2 пользователя запустят эту процедуру - в результате получишь неправильные данные
...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32073077
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 alexeyvg:
Непонятки в этом:
1. they are visible only to the current connection for the user; and they are deleted when the user disconnects from instances of Microsoft® SQL Server™ 2000.

2. A local temporary table created in a stored procedure is dropped automatically when the stored procedure completes.

Пункты 1 и 2 разнесены по разным разделам BOL, я лично не сразу, пункт 2 можно просто не найти...

2 Белов Владимир:
Проц1 - процедура редактирования данных (всех данные редактируются через хп)
Проц2 - процедура аудита на основе метаданных и динамического SQL.
Так что вызов проц1 из проц2 невозможен, пихать лишний код в процедуры редактирования, тоже не хочется...
Что делать, приходится иcпользовать глобальную :((, поскольку перед апдейтом нужно занести старые значения, а после апдейта - проапдейтить новые...
Если 2 пользователя запустят процедуру, думаю ничего не произойдет, поскольку временная таблица создается внутри транзакции, перед commit'ом данные заливаются в основную таблицу аудита и таблица убивается, при ошибке траназкция откатывается..
Или я не прав?
...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32073131
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Makc
Аааа...
Если #table создана в ХП, то она видима в этой ХП и в вызовах ниже.
Если #table создана батчем в коннекте, то она видима в этом коннекте и во всех вызовах ХП из него.
Если #table создана батчем в коннекте, и такая-же #table, но с другими полями создана в ХП, то в ХП видима локальная таблица. Правда, это может зависить от версии и сервис-пака MSSQL.

Иллюстрации:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
set nocount on
go
create proc p1
as
create table #tmp(id int)
insert #tmp values( 2 )
select * from #tmp
go
create proc p2
as
insert #tmp values( 3 )
select * from #tmp
go

create table #tmp(id2 int)
insert #tmp values( 1 )
exec p1
exec p2
drop table #tmp

go 
drop proc p1
drop proc p2
...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32073134
Фотография Белов Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Makc
угу. понятно.
то есть, если я правильно понимаю, так как ты все это делаешь в транзакции, то пользователи "ждут", пока завершиться транзакция. Правильно или я не прав ?
...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32073139
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Белов Владимир:
Да ждут.
Возможен третий вариант с генерацией имени глобальной таблицы, во избежание возможных проблем с deadlock' ом.
Буду тестрировать...
...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32073205
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно так.... но это не производительно....
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
create proc p2
@tablename VARCHAR( 36 )
as
exec('create table '+@tablename + ' (id int)')
exec('insert '+@tablename+' select 1')
go
create proc p3
@tablename VARCHAR( 36 )
as
exec('select * from '+@tablename)
go
create proc p1
as 
declare @Idtable uniqueidentifier,@tablename varchar( 36 )
set @Idtable=newid()
set @tablename=cast(@Idtable as varchar( 36 ))
exec p2 @tablename=@tablename
exec p3 @tablename=@tablename

лучше создать постаянную таблицу(не временную постоянную ##)
добавить туда поле uniqueidentifier
и передовать от процы к проце его.... так быстрее... и не пересекаются...
...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32073225
Makc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Постоянная таблица есть, туда заливаются данные из временной таблицы. Но непосредственно работать с ней - непроизводительно - поскольку записей в ней будет много, а количество запросов на вставку и обновление зависит от числа столбцов по которым ведется аудит...
Кусок кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
	if @action='edit'
		declare columns_cursor cursor fast_forward
			for select aColumn, name from aColumns where aTable=@aTable and IsAudit= 1 
	else
		declare columns_cursor cursor fast_forward
			for select aColumn, name from aColumns where aTable=@aTable 


	open columns_cursor
	if @@error<> 0  goto ErrorHandler

	fetch next from columns_cursor into @aColumn, @columnname

	if @@error<> 0  goto ErrorHandlerCursor

	while @@fetch_status= 0  begin
		if @mode='old'
			begin
			if @condition is null
				set @sql='insert into ##audit(aTableEvent, aColumn, OldValue) select ' +
					cast(@TableEventId as varchar( 19 )) + ' as aTableEvent, ' + 
					cast(@aColumn as varchar( 19 )) + ' as aColumn, ' + 
					'cast(' + @columnname + ' as nvarchar(4000)) as OldValue ' + 
					' from ' + 
					@tablename + ' where ' + @idcolumn + '=' + cast(@rowid as varchar( 19 ))
			else
				set @sql='insert into ##audit(aTableEvent, aColumn, OldValue) select ' +
					't1.aTableEvent as aTableEvent, ' + 
					cast(@aColumn as varchar( 19 )) + ' as aColumn, ' + 
					'cast(t2.' + @columnname + ' as nvarchar(4000)) as OldValue ' + 
					' from aTableEvents t1 inner join ' + 
					@tablename + ' t2 on t1.rowid=t2.' +  @idcolumn + 
					' and t1.eventid=' + cast(@eventid as varchar( 19 )) + 
					' and t1.aTable=' + cast(@aTable as varchar( 19 )) 
			end

		else
			begin
			if @condition is null
				set @sql='update ##audit set NewValue=(select cast(' + 
					@columnname + ' as nvarchar(4000)) from ' +
					@tablename + ' where ' + @idcolumn + '=' + cast(@rowid as varchar( 19 )) + ')' + 
					' where aColumn=' + cast(@aColumn as varchar( 19 ))
			else

				set @sql='update ##audit set NewValue=cast(t2.' + 
					@columnname + ' as nvarchar(4000)) from ' +
					@tablename + ' t2 inner join aTableEvents t1 ' +
					' on t1.rowid=t2.' +  @idcolumn + 
					' and t1.eventid=' + cast(@eventid as varchar( 19 )) + 
					' and t1.aTable=' + cast(@aTable as varchar( 19 )) + 
					' where ##audit.aColumn=' + cast(@aColumn as varchar( 19 )) + 
					' and ##audit.aTableEvent=t1.aTableEvent'
			end
		 --print @sql 
 
		exec (@sql)
		if @@error<> 0  goto ErrorHandlerCursor
		fetch next from columns_cursor into @aColumn, @columnname
	end



...
Рейтинг: 0 / 0
Вопрос по local temporary table
    #32073270
VAT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Была такая ситуация:
В довольно сложную процедуру (время построения плана было существенным, т.е. иногда больше времени выполнения) данные передавались через #t, которая создавалась до вызова этой процы.
Соответственно, при вызове план строился заново, т.к. до вызова процедуре о #t ничего не было известно.
Сделал обычную t с полем spid = @@SPID, чтоб процессы не путались. Залетало.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вопрос по local temporary table
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]