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

Откуда:
Сообщений: 161
Вопрос:

Почему для временных процедур нельзя их создавать, использовать и удалять в одном батче как таблицы ?
create proc #P
as
begin
declare @s int
end
drop proc #P

А для временных таблиц ведь можно же так:
create table #T (s int)
drop table #T
29 апр 21, 12:08    [22316232]     Ответить | Цитировать Сообщить модератору
 Re: Создание и использование ВРЕМЕННЫХ процедур в одном батче.  [new]
Владислав Колосов
Member

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

с чего Вы решили, что нельзя?
29 апр 21, 12:56    [22316282]     Ответить | Цитировать Сообщить модератору
 Re: Создание и использование ВРЕМЕННЫХ процедур в одном батче.  [new]
AlexanP
Member

Откуда:
Сообщений: 161
create proc #P
as
begin
declare @s int
end
drop proc #P

Два раза запускам и получаем сообщение:

Msg 2714, Level 16, State 3, Procedure #P, Line 1 [Batch Start Line 0]
There is already an object named '#P' in the database.
29 апр 21, 13:25    [22316314]     Ответить | Цитировать Сообщить модератору
 Re: Создание и использование ВРЕМЕННЫХ процедур в одном батче.  [new]
aleks222
Member

Откуда:
Сообщений: 1352
AlexanP

А для временных таблиц ведь можно же так:
create table #T (s int)
drop table #T


Фигушки.
Низзя.
В процедуре.

Ну, т.е.
create table #T (s int)
drop table #T
можно.
Только ненужно drop table #T.

А вот
create table #T (s int)
drop table #T
create table #T (s int)

низзя.
29 апр 21, 13:29    [22316317]     Ответить | Цитировать Сообщить модератору
 Re: Создание и использование ВРЕМЕННЫХ процедур в одном батче.  [new]
Владислав Колосов
Member

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

если в этом смысле, то время жизни временной таблицы - пакет, а процедуры - подключение. Некоторые DDL операции требуют выполнения в отдельном пакете, но в справке об этом я не нашел информации.
29 апр 21, 13:50    [22316342]     Ответить | Цитировать Сообщить модератору
 Re: Создание и использование ВРЕМЕННЫХ процедур в одном батче.  [new]
Тяп-ляп
Member

Откуда: Москва
Сообщений: 826
create proc #P
as
begin
    DECLARE @s INT = 1
    SELECT @s AS s
END
drop proc #P
GO
EXEC #P


Похоже, строка
drop proc #P
не выполняется, а становится частью текста процедуры.
29 апр 21, 16:51    [22316468]     Ответить | Цитировать Сообщить модератору
 Re: Создание и использование ВРЕМЕННЫХ процедур в одном батче.  [new]
Тяп-ляп
Member

Откуда: Москва
Сообщений: 826
Что, впрочем, ожидаемо
29 апр 21, 16:52    [22316469]     Ответить | Цитировать Сообщить модератору
 Re: Создание и использование ВРЕМЕННЫХ процедур в одном батче.  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6178
Тяп-ляп
Похоже, строка
drop proc #P

не выполняется, а становится частью текста процедуры.

Документация на эту тему высказывается абсолютно однозначно:
Limitations and Restrictions
The CREATE PROCEDURE statement cannot be combined with other Transact-SQL statements in a single batch.

Соответственно, все прочие инструкции батча, невзирая на процедурные скобки, становятся частью ХП.
А вот для CREATE TABLE в документации упоминаний про подобные ограничения нет.
30 апр 21, 08:02    [22316654]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить