Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 временные таблицы  [new]
userr09
Member

Откуда:
Сообщений: 6
Опыт у меня небольшой, прошу помочь. Нужно, чтобы при выполнении одновременно несколькими пользователями создавалась для каждого своя временная таблица, куда каждый из них бросает свои данные. Т.е. name у таблицы одинаковое для всех - oper, а собственник должен быть разный, н-р, Work\Ivanov, work\Petrov. Делаю так:

CREATE PROCEDURE Spisok_TD
  @pr int,
  @codref int,
  @Kolzap_oper int output,
  @codref2 int output 
as

DECLARE 
  @obozn nvarchar (21),
  @name nvarchar (160),
  @kolSpisok int

if @pr=0
begin
--чистим врем. БД, добавляем в OPER Mk c codref=@codref и все её операции
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = '#Oper')
   DROP TABLE #Oper

Create table #Oper
  (id int,
   ob nvarchar (21) null,
   name nvarchar (160) null,
   this_mk bit) 

DECLARE 
  @codref1 int,
  @toob nvarchar (21),
  @toname nvarchar (160),
  @this_mk1 bit,
--  @num_oper smallint,
  @tocod int

select @obozn=cod_mk from dbo.mk where codref= @codref
select @name=name_rez from dbo.mk where codref= @codref
insert into spis_mk (id,ob,name,this_mk) values(@codref,@obozn,@name,1)

exec cursor_MKSETOP @codref  --все операции этой МК выбираю в курсор MKSETOP
select @Kolzap_oper=count(*) from #oper
end --@pr=0


А эта проц для курсора:

CREATE PROCEDURE cursor_MKSETOP
  @codref int
as
DECLARE 
  @codref1 int,
  @toob nvarchar (21),
  @toname nvarchar (160),
  @this_mk1 bit,
--  @num_oper smallint,
  @tocod int

--все операции этой МК выбираю в курсор MKSETOP
DECLARE MKSETOP_cursor CURSOR FOR
select  m.codref,n.toob,n.toname,m.this_mk,
       m.tocod from dbo.mksetop m
     inner join dbo.oku n on m.tocod=n.tocod
 where (m.codref=@codref) and (m.this_mk=0)
union
select  m.codref,n.cod_mk as toob,n.name_rez as toname,m.this_mk,
       m.tocod from dbo.mk n
     inner join dbo.mksetop m on n.codref=m.tocod
where (m.codref=@codref) and (m.this_mk=1)



OPEN MKSETOP_cursor
FETCH NEXT FROM MKSETOP_cursor
  INTO @codref1,@toob,@toname,@this_mk1,@tocod

WHILE @@FETCH_STATUS = 0
BEGIN
   -- запишу во временную БД значения переменных из курсора
     insert into #oper (id,ob,name,this_mk) 
              values (@tocod,@toob,@toname,@this_mk1)

   FETCH NEXT FROM MKSETOP_cursor
              INTO @codref1,@toob,@toname,@this_mk1,@tocod
END

----------
CLOSE MKSETOP_cursor
DEALLOCATE MKSETOP_cursor
GO

проблемы такие: при запуске с разных клиентских мест ругается, что oper не найдена.
Прошу помочь с кодом.

Сообщение было отредактировано: 3 ноя 09, 13:59
3 ноя 09, 08:34    [7874380]     Ответить | Цитировать Сообщить модератору
 Re: временные таблицы  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
Коллега почитайте про область видимости временных таблиц, много нового узнаете…

---------------------------------------------------------
- Ну вы тут и нафлудили! - сказал Геракл, зайдя на Авгиев форум..
3 ноя 09, 08:43    [7874394]     Ответить | Цитировать Сообщить модератору
 Re: временные таблицы  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> проблемы такие: при запуске с разных клиентских мест ругается, что oper
> не найдена.

оригинальное сообщение об ошибке и версию сервера увидеть можно?

Posted via ActualForum NNTP Server 1.4

3 ноя 09, 08:45    [7874401]     Ответить | Цитировать Сообщить модератору
 Re: временные таблицы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Опыт у меня небольшой, прошу помочь.


начать советую с чтения раздела документации в части CREATE TABLE->Temporary Tables, дабы открыть для себя область видимости и время существоания локальных временных таблиц.

ЗЫ. По приведенному коду не видна необходимость применения ни временной таблицы, ни курсора. Все может быть сделано одним запросом.
3 ноя 09, 08:49    [7874411]     Ответить | Цитировать Сообщить модератору
 Re: временные таблицы  [new]
userr09
Member

Откуда:
Сообщений: 6
А это всего фрагмент процедуры. И поверьте, что курсор нужен. Вообщем, вопрос тот же: нужно для каждого пользователя создавать каждому таблицу с именем oper. И дальше каждый работает со своей таблицей oper. (при одновременной работе нескольких пользователей). На предмет "почитать"- почитаю, если вам, корифеям, трудно подсказать.
3 ноя 09, 10:31    [7874894]     Ответить | Цитировать Сообщить модератору
 Re: временные таблицы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
userr09
Вообщем, вопрос тот же: нужно для каждого пользователя создавать каждому таблицу с именем oper. И дальше каждый работает со своей таблицей oper. (при одновременной работе нескольких пользователей). На предмет "почитать"- почитаю, если вам, корифеям, трудно подсказать.


Ответ тот же - почитайте. А если лень, то лучше чем-нибудь себя другим занять...
3 ноя 09, 10:33    [7874912]     Ответить | Цитировать Сообщить модератору
 Re: временные таблицы  [new]
userr09
Member

Откуда:
Сообщений: 6
Всё. Совсем запуталась. Создается таблица Work\Petrov.spis_mk на рабочем месте Work\Petrov такими командами:

Create table spis_mk
(id int,
ob nvarchar (21) null,
name nvarchar (160) null,
this_mk bit)

А вставить не могу по командам:

insert into spis_mk (id,ob,name,this_mk) values(1,'2','3',1)

потому как spis_mk нет, а есть Work\Petrov.spis_mk. Как добавить собственника в
insert into spis_mk (id,ob,name,this_mk) values(@codref,@obozn,@name,1) ? По user_name(), user имя получаю. подскажите, где ошибка! Пжалста.
3 ноя 09, 13:05    [7876273]     Ответить | Цитировать Сообщить модератору
 Re: временные таблицы  [new]
Glory
Member

Откуда:
Сообщений: 104760
userr09


потому как spis_mk нет, а есть Work\Petrov.spis_mk. Как добавить собственника в
insert into spis_mk (id,ob,name,this_mk) values(@codref,@obozn,@name,1) ? По user_name(), user имя получаю. подскажите, где ошибка! Пжалста.

У каждого объекта есть схема/владелец. Которых и надо указывать в имени объекта
Об этом тоже написано в хелпе
3 ноя 09, 13:09    [7876317]     Ответить | Цитировать Сообщить модератору
 Re: временные таблицы  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31168
userr09
А это всего фрагмент процедуры. И поверьте, что курсор нужен.
Не поверим.

userr09
А это всего фрагмент процедуры. И поверьте, что курсор нужен. Вообщем, вопрос тот же: нужно для каждого пользователя создавать каждому таблицу с именем oper. И дальше каждый работает со своей таблицей oper. (при одновременной работе нескольких пользователей).
Это невозможно. Только если таблица не oper, а #oper. Тогда всё нормально, и специально ничего делать не надо.

userr09
проблемы такие: при запуске с разных клиентских мест ругается, что oper не найдена.

Таблица у вас не oper, и не #Oper, а #oper. Разница большая.

Этот код ошибочный:
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = '#Oper')

В общем, ошибка на ошибке. Читайте побольше.
3 ноя 09, 14:02    [7876827]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить