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

Откуда: стольный град Киев
Сообщений: 34
Добрый день.

Имеется вот такой скрипт:

CREATE PROCEDURE spTEST2
AS
BEGIN
	CREATE TABLE #T (Name VARCHAR(1000))

	SELECT Name FROM #T
END
GO

CREATE PROCEDURE spTEST1
AS
BEGIN
	CREATE TABLE #T (ID INT)

	EXEC spTEST2
END
GO

EXEC spTEST1
GO


При вызове процедуры spTEST1 выводится сообщение об ошибке:

Msg 207, Level 16, State 1, Procedure spTEST2, Line 8
Invalid column name 'Name'.


Ведь каждая временная таблица видна только в своей процедуре - откуда тогда такое сообщение?

Проявляется на нижеследующих версиях:

Microsoft SQL Server 2005 - 9.00.5000.00 (X64)  Dec 10 2010 10:38:40   Copyright (c) 1988-2005 Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) 

Microsoft SQL Server 2005 - 9.00.5000.00 (X64)  Dec 10 2010 10:38:40   Copyright (c) 1988-2005 Microsoft Corporation  Developer Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) 

Microsoft SQL Server 2005 - 9.00.5057.00 (X64)  Mar 25 2011 13:33:31   Copyright (c) 1988-2005 Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.1 (Build 7601: Service Pack 1) 

Microsoft SQL Server 2012 - 11.0.2100.60 (X64)  Feb 10 2012 19:39:15 	Copyright (c) Microsoft Corporation	Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
5 сен 13, 16:30    [14800823]     Ответить | Цитировать Сообщить модератору
 Re: Хранимки, временные таблицы - непонятный эффект  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> Ведь каждая временная таблица видна только в своей процедуре

и во всех вложенных. и если временная таблица на момент компиляции процедуры уже существует, то будет проверено, что используемые в процедуре столбцы присутствуют в этой таблице. это by design такое.
5 сен 13, 16:36    [14800855]     Ответить | Цитировать Сообщить модератору
 Re: Хранимки, временные таблицы - непонятный эффект  [new]
Glory
Member

Откуда:
Сообщений: 104751
Джонни Кейдж
Ведь каждая временная таблица видна только в своей процедуре - откуда тогда такое сообщение?

Проявляется на нижеследующих версиях:

От копмилятора
Который компилирует spTEST2 при уже созданной #T
5 сен 13, 16:38    [14800867]     Ответить | Цитировать Сообщить модератору
 Re: Хранимки, временные таблицы - непонятный эффект  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Ведь каждая временная таблица видна только в своей процедуре - откуда тогда такое сообщение?

Это кто сказал?
Перед вызовом процедуры можно создать временную таблицу и внутри она вполне себе будет видна.
Наоборот - да, не получится
5 сен 13, 16:39    [14800876]     Ответить | Цитировать Сообщить модератору
 Re: Хранимки, временные таблицы - непонятный эффект  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Кот Матроскин
Ведь каждая временная таблица видна только в своей процедуре - откуда тогда такое сообщение?

Это кто сказал?
Перед вызовом процедуры можно создать временную таблицу и внутри она вполне себе будет видна.
Наоборот - да, не получится
Это если имя не экранируется внутри процедуры своей внутренней временной таблицей.
Проблема, как я всегда думал, обратиться из такой процедуры к таблице, созданной снаружи.
5 сен 13, 16:42    [14800900]     Ответить | Цитировать Сообщить модератору
 Re: Хранимки, временные таблицы - непонятный эффект  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
daw
> Ведь каждая временная таблица видна только в своей процедуре

и во всех вложенных. и если временная таблица на момент компиляции процедуры уже существует, то будет проверено, что используемые в процедуре столбцы присутствуют в этой таблице. это by design такое.
Вообще, как-то криво выглядит этот "by design"
5 сен 13, 16:43    [14800909]     Ответить | Цитировать Сообщить модератору
 Re: Хранимки, временные таблицы - непонятный эффект  [new]
Crimean
Member

Откуда:
Сообщений: 13147
известный побочный эффект DRI. вот так:

EXEC spTEST2
go
EXEC spTEST1
GO


уже не глючит. совет - называйте времянки по-разному в разных хранимках, если предполагается вызов одной из другой + это таки разные таблички. ибо
5 сен 13, 16:46    [14800932]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить