![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переменное название временной таблицы в сохраненной процедуре. [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
...