Запрос SQL Server, который никогда не может работать, принимается в хранимой процедуре - PullRequest
0 голосов
/ 23 мая 2018
create procedure tempsproc
as 
    select t1.c1
    from #t 
    join t2 on #t.c2 = t3.c3

Предложение select ссылается на таблицу, которая не упоминается в предложении from.Я слышал об отложенном разрешении имен, но не вижу, как вышеприведенный выбор мог бы работать независимо от того, какие таблицы существуют во время выполнения.

Предложение on также ссылается на таблицы, которые не упомянуты в предложении from.

Приведенный выше SQL компилируется без ошибок.

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

Что мне нужно сделать, чтобы SQL Server отклонил указанную выше процедуру во время компиляции?

PS: это в системе SQL Server 2008 R2 sp3

1 Ответ

0 голосов
/ 23 мая 2018

Это может работать (с точки зрения компиляторов SQL), если в одну из таблиц добавлен столбец с именем t1, а также добавлен метод метод с именем c1.в базу данных.

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

Короче, это не синтаксическая ошибка, поэтому НЕ будет отклонено.


Подобные проблемы действительно следует обнаруживать во время отладки, но если выКогда вы анализируете и сохраняете хранимые процедуры, вы можете получить их в основном, выполнив что-то вроде этого:

create procedure tempsproc
as 
    select t1.c1
    from #t 
    join t2 on #t.c2 = t3.c3
go
BEGIN TRANSACTION
    EXEC tempsproc;
ROLLBACK TRANSACTION
go

МЕТОДЫ ТИПА

Меня попросили рассказать о методах типов, поэтому вот оно.

Большинство новых типов данных, таких как XML и Spatial, включают специальные методы, которые можно использовать только вэти типы данных.Вот пример от Microsoft:

CREATE TABLE SpatialTable   
    ( id int IDENTITY (1,1),  
    GeomCol1 geometry,   
    GeomCol2 AS GeomCol1.STAsText() );  
GO  

INSERT INTO SpatialTable (GeomCol1)  
VALUES (geometry::STGeomFromText('LINESTRING (100 100, 20 180, 180 180)', 0));  

Здесь показаны два очень разных формата метода (GeomCol1.STAsText() и geometry::STGeomFromText('...')), что подчеркивает еще один момент.

Этот синтаксис должен был соответствовать определенным стандартам (в данном случае OGC).Методы XML должны соответствовать другому стандарту.Другие типы данных, которые они добавят в будущем, возможно, должны будут соответствовать еще другим стандартам, что означает, что они должны быть достаточно гибкими в отношении того, каким может быть допустимый синтаксис метода, включая то, есть ли у него круглые скобки.

Наконец, вы можете задаться вопросом: « Но разве они не знают заранее, какие существуют методы типов данных? » Удивительно, но ответ «НЕТ», потому что SQL Server позволяет новым типам данныхбыть добавлены к существующим серверам и базам данных.Так, например, типы данных XML изначально были необязательным дополнением (расширением) к SQL Server (затем они были встроены в следующую основную версию).Кроме того, я считаю (не уверен), что клиенты и третьи стороны также могут создавать свои собственные и добавлять их в существующую базу данных.

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