Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 проблемы с временной таблицой  [new]
20042017
Guest
Здравствуйте !
1. Есть процедура в которой создаётся временная таблица #Tmp, делаются над некоторые операции, и в конце концов уничтожается.
2. Есть другая процедура, которая тоже создаёт таблицу #Tmp (своей структуры) и точно также уничтожает её вконце.

Случилось так, что понадобилось во второй процедуре получить результат из первой. Вроде бы никаких проблем, создал результирующую табличку и вставил в неё результат из первой процедуры.
Всё прекрасно работает и никакого конфликта имён не наблюдается.

Проблема возникает при вызове процедуры с клиента, возвращается ошибка об отсутствии поля в таблице, при запуске процедуры с Managment Studio ошибки нет.

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

Помогите пожалуйста, может есть какая та настройка типа уникальность наименований временных таблиц
20 апр 17, 14:24    [20418861]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 34676
Не называйте одинаково времянки разной структуры в вызывающих процедурах. Будете ловить вот такие вот ошибки компиляции.
20 апр 17, 14:29    [20418879]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 4842
20042017,

настройка называется "руки программиста". Вы же их назвали одинаково, как и какие настройки помогут? Автоматические переименование при выполнении скрипта, что ли?
20 апр 17, 14:40    [20418921]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
msLex
Member

Откуда:
Сообщений: 4848
20042017
Здравствуйте !
1. Есть процедура в которой создаётся временная таблица #Tmp, делаются над некоторые операции, и в конце концов уничтожается.
2. Есть другая процедура, которая тоже создаёт таблицу #Tmp (своей структуры) и точно также уничтожает её вконце.

Случилось так, что понадобилось во второй процедуре получить результат из первой. Вроде бы никаких проблем, создал результирующую табличку и вставил в неё результат из первой процедуры.
Всё прекрасно работает и никакого конфликта имён не наблюдается.

Проблема возникает при вызове процедуры с клиента, возвращается ошибка об отсутствии поля в таблице, при запуске процедуры с Managment Studio ошибки нет.

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

Помогите пожалуйста, может есть какая та настройка типа уникальность наименований временных таблиц


Это известная баго-фича.

Если в момент компиляции/перекомпиляции процеудры, в которой есть создание # таблицы, # таблицы с нужным именем уже существует, используется её структура.

Поэтому микрософт настоятельно рекомендует в таких случаях (создание одноименных # таблиц во вложенных процедурах) иметь для таких таблиц одинаковую структуру


Тынц на офф документацию
(на русском, да простит меня 0-0)


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

20 апр 17, 14:55    [20419018]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
msLex
Member

Откуда:
Сообщений: 4848
Владислав Колосов
Вы же их назвали одинаково


Если вызвать две процедуры, которые создают одноименные временные с разной структурой, последовательно, то никаких проблем не возникнет.
А если вызвать их "вложено", то проблемы ИНОГДА возникаю.

Я склонен считать такое поведения "задокументированной багой"
20 апр 17, 14:58    [20419040]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
20042017
Guest
Если в момент компиляции/перекомпиляции процеудры, в которой есть создание # таблицы, # таблицы с нужным именем уже существует, используется её структура.

То есть если PROC2 использует PROC1 с одинаковыми названиями #TMP, то нужно делать
ALTER PROC2
ALTER PROC1

а не

ALTER PROC1
ALTER PROC2
21 апр 17, 07:36    [20420777]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 34676
20042017
Если в момент компиляции/перекомпиляции процеудры, в которой есть создание # таблицы, # таблицы с нужным именем уже существует, используется её структура.

То есть если PROC2 использует PROC1 с одинаковыми названиями #TMP, то нужно делать
ALTER PROC2
ALTER PROC1

а не

ALTER PROC1
ALTER PROC2
При чем тут alter? Валятся ваши процедуры при компиляции перед выполнением.
21 апр 17, 12:33    [20421819]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
20042017
Guest
В том то и проблема, что с MS никакой ошибки нет. Ошибка появляется с клиента.
Копирую запрос из профайлера, вставляю в MS и о чудо нет конфликта имён.
21 апр 17, 13:37    [20422179]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 34676
20042017
В том то и проблема, что с MS никакой ошибки нет. Ошибка появляется с клиента.
Копирую запрос из профайлера, вставляю в MS и о чудо нет конфликта имён.
И?
21 апр 17, 13:50    [20422303]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
msLex
Member

Откуда:
Сообщений: 4848
20042017,

Я же вам привел цитату из бола.

Нельзя называть одинаковыми именами временные таблицы если они имеют разную структуру и создаются в процедурах, вызывающих друг друга.
21 апр 17, 13:53    [20422335]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
o-o
Guest
каждый говорит о своем, и все потому,
что кто-то не приводит код.

20042017, что вы выдернули из профайлера?
вот все прекрасно воспроизводится в студии:
create proc dbo.p1 
as
  print 'print from dbo.p1 before create';
  create table #t (col1 int, col2 int);
  insert into #t values (1, 1);
  select *
  from #t
go  
  
create proc dbo.p2 
as
  create table #t (col1 int);
  insert into #t values (1);
  print 'outer #t created';  
  exec dbo.p1;
go
  
exec dbo.p2;


(1 row(s) affected)
outer #t created
Msg 213, Level 16, State 1, Procedure p1, Line 5
Column name or number of supplied values does not match table definition.


и это именно то, что описано в хелпе и о чем вам тут говорят:
при исполнении второй процедуры выполняется все ровно до вызова первой;
первая НЕ выполняется, она даже не компилируется
(из второй она не компилируется, а не сама по себе!)
потому что снаружи ее уже есть временная таблица другого состава, но с тем же именем.
---
а теперь покажите ваш код,
урезанный до минимума, где бы было что-то другое
21 апр 17, 14:03    [20422406]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
invm
Member

Откуда: Москва
Сообщений: 7327
20042017
Ошибка появляется с клиента.
Потому что в момент компиляции процедуры уже существует одноименная временная таблица.
Почему процедура компилируется заново при вызове из клиента? Потому что разные опции соединения у клиента и у студии.

В общем, разбирайтесь с клиентом.
21 апр 17, 14:06    [20422426]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
msLex
Member

Откуда:
Сообщений: 4848
invm
В общем, разбирайтесь с клиентом.

ой, зря вы это сказали...
ТС теперь будет "шаманить" с клиентом, добьется, что на момент вызова внешней процедуры уже будет построен план вложенной, и все отработает хорошо.
Он успокоится, а потом, когда план внутренней процедуры по каким-то причинам будет удален из кеша, получит туже "плавающую" плоховоспроизводимую ошибку.
21 апр 17, 14:18    [20422481]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
20042017
Guest
Но почему раньше (несколько лет) работало ?
21 апр 17, 15:08    [20422743]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
o-o
Guest
20042017
Но почему раньше (несколько лет) работало ?

возьмите мой пример, попробуйте запустить, как есть, вывалится ошибка компиляции.
теперь выполните отдельно p1, затем снова p2.
уже никаких ошибок.
выше же написали: если уже есть план в кэше, то не будет (пере)компилироваться.
как только плана не будет, и первым пойдет запуск p2, все повторится.
ну и кто знает, почему у вас вынесло план p1,
и почему до этого сперва была запущена p1.
как уже опять же писали, достаточно, чтобы у клиенте были другие параметры соединения,
и ему уже нужен свой план
21 апр 17, 15:21    [20422826]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
Ролг Хупин
Member

Откуда: Оттуда
Сообщений: 1003
20042017
Но почему раньше (несколько лет) работало ?


что "работало" раньше и не работает сегодня?
22 апр 17, 08:21    [20424330]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
20042017
Guest
Проблема продолжает прогрессировать.
Так как вызов процедур из процедур встречается часто, то стали поступать жалобы на отказ работы других участков.
Проблема возникла на новой базе, которая была скопирована со старой.
То есть на данный момент есть 2 базы, с одинаковым содержанием ханимок, но в одной вызовы PROC1->PROC2 работают, а в другой нет.
Скорее всего что-то в настройках самой базы. Визуальное сравнение свойств обеих бах ни к чему не привело
24 апр 17, 08:31    [20427680]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
o-o
Guest
вы ответы читаете или нет?
если вложенную процедуру сперва вызвать саму по себе,
ее план будет построен, когда нет внешней временной таблицы и проблемы не будет.
если первым идет вызов внешней, то получаете ошибку.
нет настроек базы типа "тотальный запрет вызова первыми процедур, имеющих вызовы других"
но в одной и той же базе, скопированной кучу раз,
пользователь волен вызвать процедуры в одном порядке на ондой копии
и в другом на другой
24 апр 17, 08:37    [20427685]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
20042017
Guest
Я ответы читаю и пришёл сюда за помощью и не от нечего делать.
если вложенную процедуру сперва вызвать саму по себе,
ее план будет построен, когда нет внешней временной таблицы и проблемы не будет.
если первым идет вызов внешней, то получаете ошибку.

Одинаковый порядок вызов процедур в старой базе и в новой, но в старой всё работает годами, а в новой не работает.
24 апр 17, 08:56    [20427704]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
o-o
Guest
как вы докажете, что в старой базе вы же и не вызвали сперва вложенную процедуру?
например, еще при разработеке?
24 апр 17, 09:07    [20427722]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
o-o
Guest
можно, кстати, и в старой сейчас инвалидировать план вложенной.
сделайте ей ALTER PROC, не меняя текста процедуры.
потом пусть клиент вызовет внешнюю.
план внутренней будет построен уже после вызова внешней
24 апр 17, 09:10    [20427726]     Ответить | Цитировать Сообщить модератору
 Re: проблемы с временной таблицой  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 4842
Похоже, там в запросе формирования временной таблицы звездочка.
24 апр 17, 12:52    [20428686]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить