Ви можете створити збережені процедури, які посилаються на об'єкти, які ще не існують (наприклад, таблиці та функції). Ви не можете створити збережені процедури для тих посилальних стовпців, які ще не існують в об'єктах, які вже існують. Це меч з двома кінцями відкладеної роздільної здатності імені - SQL Server дає користь від сумнівів у деяких випадках, але не у всіх. Дивіться ідеї Ерланда дляSET STRICT_CHECKS ON;
щоб отримати деякі уявлення про місця, де це працює, та місця, які він порушує:
http://www.sommarskog.se/strict_checks.html
(І як він хотів би полярну протилежність тому, що ти шукаєш - ти хочеш дозволити що-небудь збирати незалежно від існування, і він хоче перевірити кожен стовпець або таблицю.)
Немає таких налаштувань SET DEFERRED_NAME_RESOLUTION OFF;
що його просили:
http://connect.microsoft.com/sql/127152
Таких налаштувань немає IGNORE ALL_RESOLUTION;
.
Ви можете подолати це кількома способами, зокрема:
(a) використовувати динамічний SQL в ураженій збереженій процедурі.
(b) створити заглушку, CREATE PROCEDURE
не маючи нічого в ній, а потім запустити решту сценарію, а потім виконатиALTER PROCEDURE
що має справжнє тіло (по суті, розгорніть процедуру в два етапи).
(c) зробити свій інструмент розгортання розумнішим щодо порядку операцій. Якщо зміни таблиці вимагають наявності функції, скрипт цих змін триває. Засоби порівняння схем, такі як RedGate SQL Порівняння, досить добре допомагають створювати сценарії для вас у відповідному порядку залежності. Ви не згадуєте, який інструмент використовуєте, але якщо це не робиться ...
(г) Мартін Сміт має тут цікаве рішення , але я з ним не грав.