Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Переменное название временной таблицы в сохраненной процедуре.
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! 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) Вторая строчка верна? Мучают сомнения, что нет... Заранее всем благодарен за любой конструктивный (и не очень) ответ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2002, 10:35 |
|
||
|
Переменное название временной таблицы в сохраненной процедуре.
|
|||
|---|---|---|---|
|
#18+
В MS SQL7 нет макроподстановок (может в 2000 что изменилось, но сомневаюсь). Т.е. синтаксис типа create table #@RepGr ... в корне неверен. Следовало бы писать примерно так: DECLARE @cString VarChar(100) SET @cString = 'create table #'+@RepGr+' (Smol_n nvarchar(50))' EXECUTE(@cString) Однако, проблема в данном случае в том, что при таком создании локальная временная таблица будет существовать только внутри команды EXECUTE и по ее завершении автоматически удалится. Можно, конечно создать постоянную или глобальную временную таблицу если тебе это нужно. С другой стороны, а зачем тебе вообще необходима временная таблица именно на сервере? Может проще сделать ее у клиента? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2002, 11:24 |
|
||
|
Переменное название временной таблицы в сохраненной процедуре.
|
|||
|---|---|---|---|
|
#18+
Спасибо. Но не надо именно вр. табл на сервере... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.05.2002, 13:50 |
|
||
|
Переменное название временной таблицы в сохраненной процедуре.
|
|||
|---|---|---|---|
|
#18+
Несколько замечаний Как верно сказал ВладимирМ макроподстановок нет. Причем все еще хуже: даже если быудалось обойтись без этого дела (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 не возвращается! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.05.2002, 09:09 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32029567&tid=1822837]: |
0ms |
get settings: |
9ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 272ms |
| total: | 436ms |

| 0 / 0 |
