Ao criar um procedimento armazenado no SQL Server, você pode se referir a tabelas que não existem. Mas, se a tabela existir, qualquer coluna mencionada no procedimento deverá existir nessa tabela ( Resolução de Nome Diferido ).
É possível instruir o SQL Server para adiar a resolução de nomes de todas as tabelas mencionadas em um procedimento, independentemente de elas existirem ou não? Quero manter a verificação geral da sintaxe, portanto, mesmo se possível, invadir a definição de procedimento armazenado em uma tabela do sistema não é uma opção.
Espero que minha solicitação para fazer isso possa parecer um pouco estranha , então, aqui estão alguns antecedentes: eu gero automaticamente definições de tabela e procedimentos armazenados a partir de um aplicativo escrito em C # e é muito difícil para mim alterar o código para ordenar as alterações conforme o SQL precisar eles. Meu código "garante" que o esquema seja consistente em uma transação, mas atualmente não posso garantir que as colunas da tabela sejam definidas antes de definir o procedimento armazenado que as referencia.
Abaixo está um exemplo canônico do SQL criado pelo C # que "ilustra" o problema que estou tentando resolver.
--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
Ele é possível para mim para corrigir isso no código C #, mas eu estou esperando por um simples "mágica" ajustar posso puxar o SQL. Isso vai economizar muito tempo para mim.
fonte
Respostas:
Não.
Eu me sinto realmente culpado apenas digitando isso, mas não, infelizmente. É a primeira vez que ouvi falar desse caso de uso e faz todo o sentido. É melhor enviar uma solicitação em http://connect.microsoft.com e seus netos poderão fazer isso. ;-)
fonte
Caso você ainda esteja interessado, existe uma solução alternativa que você pode empregar. Aqui está o código atualizado, que apresenta a
#deferResolution
tabela temporária para cada consulta no procedimento. Como a tabela temporária só existirá em tempo de execução, o procedimento poderá compilar mesmo que as colunas apropriadas ainda não existammyTable
.Você receberá o mesmo plano de execução (sem referência à
#deferResolution
tabela) para cada instrução no procedimento devido à maneira como o otimizador de consultas pode provar que issoWHERE NOT EXISTS
sempre é avaliado como verdadeiro.Tudo isso dito, este é um truque terrível apresentado principalmente por interesse intelectual e pode haver um caso de ponta em que ele se quebra. Como Aaron menciona, provavelmente seria melhor fazer todas as alterações no esquema na ordem correta.
fonte