Почему Microsoft SQL Server проверяет столбцы, но не таблицы в хранимых процессах? - PullRequest
16 голосов
/ 30 ноября 2010

Microsoft SQL Server проверяет правильность имени столбца, но не правильность имени таблицы при определении хранимых процедур. Если он обнаруживает, что имя таблицы, на которую ссылаются, существует в настоящее время, он проверяет имена столбцов в выражении на соответствие столбцам в этой таблице. Так, например, это будет работать нормально:

CREATE PROCEDURE [dbo].[MyProcedure]
AS
BEGIN
    SELECT
        Col1, Col2, Col3
    FROM
        NonExistentTable
END
GO

... как будет это:

CREATE PROCEDURE [dbo].[MyProcedure]
AS
BEGIN
    SELECT
        ExistentCol1, ExistentCol2, ExistentCol3
    FROM
        ExistentTable
END
GO

... но это не удается, с «Неверное имя столбца»:

CREATE PROCEDURE [dbo].[MyProcedure]
AS
BEGIN
    SELECT
        NonExistentCol1, NonExistentCol2, NonExistentCol3
    FROM
        ExistentTable
END
GO

Почему SQL Server проверяет наличие столбцов, а не таблиц? Конечно, это противоречиво; это должно делать и то, и другое. Для нас полезно иметь возможность определять SP, которые могут ссылаться на столбцы таблиц И / ИЛИ, которые еще не существуют в схеме, поэтому есть способ отключить проверку SQL Server существования столбцов в таблицах, которые в настоящее время есть

Ответы [ 2 ]

22 голосов
/ 30 ноября 2010

Это называется отложенным разрешением имен.

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

CREATE PROCEDURE [dbo].[MyProcedure]
AS
BEGIN

CREATE TABLE #Dummy (c int)

    SELECT
        NonExistantCol1, NonExistantCol2, NonExistantCol3
    FROM
        ExistantTable 
    WHERE NOT EXISTS(SELECT * FROM #Dummy)    


DROP TABLE #Dummy

END
GO
0 голосов
/ 30 ноября 2010

Эта статья в MSDN должна ответить на ваш вопрос.

Из статьи:

Когда хранимая процедура выполняется в первый раз, запрос процессор читает текст хранимой процедуры из Представление каталога sys.sql_modules и проверяет, что имена объектов Используемые процедуры присутствуют. Этот процесс называется отложенным разрешение имен, потому что объекты таблицы, на которые ссылаются сохраненные процедура не должна существовать при создании хранимой процедуры, но только когда оно выполнено.

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