powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Переменное название временной таблицы в сохраненной процедуре.
4 сообщений из 4, страница 1 из 1
Переменное название временной таблицы в сохраненной процедуре.
    #32029556
asafr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! MS SQL занимаюсь недавно - посему и вопрос не сложный, но ответ на него, пока, мной не найден. Ногами не пинайте новичка!!!!!
Суть проблемы: Есть MDI-приложение с вызовом множества форм. В ряде форм используется список временных таблиц с одинаковой структурой. Мне необходимо, чтобы при открытии этих форм эти временные таблицы имели разные названия, например: открываю форму fm_One-> создается временная таблица с названием #GazRepGroup, открываю fm_Two -> #WaterRepGroup и т.д. Как видите, названия отличаются в первых символах названия вр. таблиц. Использую сохраненную процедуру, которая в сокращенном виде выглядит так:

CREATE PROCEDURE Test
@RepGr nvarchar(,
@5Crack nvarchar(,
@GroupSum nvarchar(
AS
IF Exists (select * from tempdb..sysobjects
where name = '#'+@RepGroup)
BEGIN
drop table #@RepGr
drop table #@5Crack
drop table #@GroupSum
END
create table #@RepGr (Smol_n nvarchar(50), Big_n nvarchar(100),
Week_ nvarchar(15), interv nvarchar(100),
val float(24), note nvarchar(100))
create table #@5Crack (Big_n nvarchar(100), val nvarchar(100))
create table #@GroupSum (Smol_n nvarchar(50), Big_n nvarchar(100), val float(24))

(Вопрос по СП немного ниже, возможно гуру и увидели уже ошибку....)
Из Дельфи5 вызываю процедуру так:
with sp_Proc do begin
try
if active then close;
ProcedureName:='Test';
Parameters.ParseSQL('Exec Test @RepGr=:@RepGr,@5Crack=:@5Crack,@GroupSum=:@GroupSum',True);
Parameters.ParamByName('@RepGr').Value:='GazRepGroup';
Parameters.ParamByName('@5Crack').Value :='Gaz5Crack';
Parameters.ParamByName('@GroupSum').Value:='GazGroupSum';
ExecProc;
finally
close
end;
end;
По моей задумке, я, объявляя в Дельфи значение переменной, например @RepCr:='GazRepGroup' при использовании СП получаю наименование вр. таблицы '#GazRepGroup' и т.д. Но не тут-то было... При дальнейшей работе с вр. таблицей вылетает ошибка:"Invalid object #GazRepGroup"... В tempdb..sysobjects название этой вр. таблицы не появляется... Я так понимаю, что 'create table #@RepGr'-в корне не верно... Что делаю не так?
И еще вопрос по СП, а именно (эта часть кода написана выше, но для удобства просмотра выношу код еще раз):
IF Exists (select * from tempdb..sysobjects
where name = '#'+@RepGroup)
Вторая строчка верна? Мучают сомнения, что нет...
Заранее всем благодарен за любой конструктивный (и не очень) ответ...
...
Рейтинг: 0 / 0
Переменное название временной таблицы в сохраненной процедуре.
    #32029567
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В MS SQL7 нет макроподстановок (может в 2000 что изменилось, но сомневаюсь).
Т.е. синтаксис типа create table #@RepGr ... в корне неверен. Следовало бы писать примерно так:

DECLARE @cString VarChar(100)

SET @cString = 'create table #'+@RepGr+' (Smol_n nvarchar(50))'

EXECUTE(@cString)

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

С другой стороны, а зачем тебе вообще необходима временная таблица именно на сервере? Может проще сделать ее у клиента?
...
Рейтинг: 0 / 0
Переменное название временной таблицы в сохраненной процедуре.
    #32029581
asafr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Но не надо именно вр. табл на сервере...
...
Рейтинг: 0 / 0
Переменное название временной таблицы в сохраненной процедуре.
    #32029625
KSergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Несколько замечаний
Как верно сказал ВладимирМ макроподстановок нет. Причем все еще хуже: даже если быудалось обойтись без этого дела (EXECUTE), то локальная временная таблица все равно существовалал бы только на время выполнения этой ХП. Мне в аналогичной ситуации пришлось пользоваться глобальными врЕменными таблицами (##, ели не заблуждаюсь). Впрочем, можно вполне и ручками удалять. Я это делаю так (придумал не я, пример, на сколько я понимаю, хрестоматийный)
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName)
EXEC ('DROP TABLE ' + @TableName)
@TableName - понятно параметр ХП (ну или вычисляемая переменная внутри ХП)

По дельфи коду.
sp_Proc - это SQLQuery или StoredProc? По виду похоже на TADOQuery. Тогда вопрос: а Parameters.ParseSQL(...) присваивает значение св-ству SQL? (я сам не знаю, всегда как-то для динамических запросов присваивал значение св-ству SQL, а потом уж ParseSQL вызывал для него).
Хотя опять же ExecProc... Не понятно какого типа sp_Proc. Скорее уж тогда не TQuery.
Но в любом случае: для ExecProc вовсе не нужно Close! Ведь никакой RecordSet не возвращается!
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Переменное название временной таблицы в сохраненной процедуре.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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