Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Переменное название временной таблицы в сохраненной процедуре. [D5, MSSQL]


asafr ©   (2002-05-06 17:05:00) 

Здравствуйте! П омогите решить небольшую проблему D5->MSSQL Server 7.0
Суть проблемы: Есть MDI-приложение с вызовом множества форм. В ряде форм используется список временных таблиц с одинаковой структурой. Мне необходимо, чтобы при открытии этих форм эти временные таблицы имели разные названия, например: открываю форму fm_One-> создается временная таблица с названием #GazRepGroup, открываю fm_Two -> #WaterRepGroup и т.д. Как видите, названия отличаются в первых символах названия вр. таблиц. Использую сохраненную процедуру, которая в сильно упрощенном виде выглядит так:
CREATE PROCEDURE asp_Test
@RepGr nvarchar(8),
@5Cr nvarchar(8),
@GrSum nvarchar(8)
AS
declare @StrRepGr nvarchar(100)
declare @Str5Cr nvarchar(100)
declare @StrGrSum nvarchar(100)
IF Exists (select * from tempdb..sysobjects
where name = "#"+@RepGr)
BEGIN
set @StrRepGr="drop table #"+@RepGr
set @Str5Cr="drop table #"+@5Cr
set @StrGrSum="drop table #"+@GrSum
Execute (@StrRepGr)
Execute (@Str5Cr)
Execute (@StrGrSum)
END
set @StrRepGr="create table #"+@RepGr+"(a nvarchar(8), b int)"
set @Str5Cr="create table #"+@5Cr+" (a nvarchar(8), c int)"
set @StrGrSum="create table #"+@GrSum+" (c int, d int)"

Execute (@StrRepGr)
Execute (@Str5Cr)
Execute (@StrGrSum)


Из Дельфи5 вызываю процедуру так:


with sp_Proc do begin
try
if active then close;
ProcedureName:="asp_Test";
Parameters.ParseSQL("Exec asp_Test @RepGr=:@RepGr,@5Cr=:@5Cr,@GrSum=:@GrSum",True);
Parameters.ParamByName("@RepGr").Value:="GazRepGroup";
Parameters.ParamByName("@5Cr").Value :="Gaz5Crack";
Parameters.ParamByName("@GrSum").Value:="GazGroupSum";
ExecProc;
finally
close
end;
end;

По моей задумке, я, объявляя в Дельфи значение переменной, например @RepCr:="GazRepGroup" при использовании СП получаю наименование вр. таблицы "#GazRepGroup" и т.д. Но не тут-то было... При дальнейшей работе с вр. таблицей вылетает ошибка:"Invalid object #GazRepGroup"... В tempdb..sysobjects название этой вр. таблицы не появляется... Что делаю не так?
Заранее всем благодарен.....


asafr   (2002-05-07 12:19:00) [1]

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


wicked   (2002-05-06 18:56:00) [2]

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


asafr   (2002-05-06 17:33:00) [3]

Может есть более интересный вариант объявления переменного названия вр. таблицы?


asafr   (2002-05-06 17:29:00) [4]

Согласен, что это подходит к части СП, где
IF Exists (select * from tempdb..sysobjects
where name = "#"+@RepGr)
BEGIN
....
....
END

Но почему не создаются вр. таблицы? Может это от того, что применяю EXECUTE? Т.е. вр. таблица создается, пока выполняется EXECUTE, а после выполнения EXECUTE вр. таблица самоуничтожается...?


Belov   (2002-05-06 17:23:00) [5]

используй
if object_id("tempdb..#GazRepGroup") is not null
...


Наверх

Титульная страница Поиск, карта сайта Написать письмо