Неправильный столбец не обнаружен при использовании таблицы #temp - PullRequest
4 голосов
/ 02 июля 2019

Пример:

create table dbo.t1 (id int)
if OBJECT_ID('dbo.s_Test') is not null drop proc dbo.s_Test 
GO
create proc dbo.s_Test 
as
    create table #t2 (id2 int)
    select t.id, t.xyz from dbo.t1 t join #t2 t2 on t2.id2 = t.id
GO

Когда был создан proc s_Test, я ожидал ошибку типа "Неверное имя столбца 'xyz', но во время создания процедуры ошибки нет. Кажется, таблица #temp как-то связана с этим, так как если я создаю эту версию с табличной переменной:

if OBJECT_ID('dbo.s_Test2') is not null drop proc dbo.s_Test2 
GO
create proc dbo.s_Test2 
as
    declare @t2 table (id2 int)    
    select t.id, t.xyz from dbo.t1 t join @t2 t2 on t2.id2 = t.id
GO

Я получаю сообщение об ошибке: неверное имя столбца 'xyz'. Любые идеи о том, почему версия таблицы #temp не выдает ошибку во время создания хранимого процесса? Использование SQL Server 2012, в случае, если это имеет значение.

1 Ответ

4 голосов
/ 02 июля 2019

Это имеет отношение к Отложенное разрешение имен и компиляция .Более подробная информация здесь: https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms190686(v=sql.105)

Во время компиляции временная таблица / переменная не существует, поэтому инструкция не будет скомпилирована.Это выдаст ошибку во время выполнения.Я знаю, это отстой.

Если вы сначала запустите оператор с табличной переменной без dbo.t1 до того, как создать, это также не выдаст ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...