При создании хранимой процедуры в SQL Server вы можете ссылаться на несуществующие таблицы. Но если таблица существует, то любой столбец, на который вы ссылаетесь в процедуре, должен существовать в этой таблице ( отложенное разрешение имен ).
Можно ли дать SQL Server команду отложить разрешение имен всех таблиц, на которые есть ссылки в процедуре, независимо от того, существуют они или нет? Я хочу сохранить общую проверку синтаксиса, поэтому, даже если бы это было возможно, взломать определение хранимой процедуры в системной таблице не вариант.
Я ожидаю, что мои просьбы сделать это могут показаться немного странными , поэтому приведу некоторую предысторию: я автоматически генерирую определения таблиц и хранимые процедуры из приложения, написанного на C #, и мне очень трудно изменить код, чтобы упорядочить изменения в соответствии с требованиями SQL их. Мой код «гарантирует», что схема согласована внутри транзакции, но в настоящее время я не могу гарантировать, что столбцы таблицы будут определены до того, как я определю хранимую процедуру, которая ссылается на них.
Ниже приведен канонический пример SQL, созданного C #, который «иллюстрирует» проблему, которую я пытаюсь решить.
--Say this table already exists.
CREATE TABLE myTable
(
a NVARCHAR(MAX)
)
GO
--My C# code creates something like this
BEGIN TRAN
GO
--the stored procedure gets generated first.
CREATE PROCEDURE mySproc
AS
BEGIN
SELECT a,b FROM myTable
END
--then the table update
ALTER TABLE myTable
ADD b nvarchar(MAX)
COMMIT TRAN
Это является возможным для меня , чтобы исправить это в C # код, но я надеюсь на простой «магии» Tweak я могу тянуть в SQL. Это сэкономит мне много времени.
источник
Ответы:
Нет.
Я чувствую себя действительно виноватым, просто печатая это, но нет, к сожалению. Это первый раз, когда я слышал об этом сценарии использования, и он имеет смысл. Лучше всего подать запрос на это на http://connect.microsoft.com, и ваши внуки смогут это сделать. ;-)
источник
На тот случай, если вы все еще заинтересованы, есть потенциальный обходной путь, который вы можете использовать. Вот обновленный код, который вводит
#deferResolution
временную таблицу для каждого запроса в процедуре. Поскольку временная таблица будет существовать только во время выполнения, процедура может компилироваться, даже если соответствующие столбцы еще не существуютmyTable
.Вы даже получите один и тот же план выполнения (без ссылки на
#deferResolution
таблицу) для каждого оператора в процедуре, так как оптимизатор запросов может доказать, что этоWHERE NOT EXISTS
всегда имеет значение true.Все это говорит о том, что это ужасный хак, представленный в основном для интеллектуального интереса, и может быть крайний случай, когда он сломается. Как упоминает Аарон, вам, вероятно, будет лучше сделать все изменения в вашей схеме в правильном порядке.
источник