Escrevi um script para adicionar uma coluna em uma tabela e, na execução bem-sucedida, atualizar seus valores. Eu sei que é apenas um script simples, mas o que há de errado com a declaração 'IF NOT EXISTS' porque o script entre BEGIN e END não está sendo executado e retorna erro. Verifiquei que não há gatilho DDL no nível do banco de dados para parar de adicionar colunas no banco de dados.
Msg 207, Nível 16, Estado 1, Linha 24
Nome de coluna inválido ColumnName.
DECLARE @CloumnAdded bit
SET @CloumnAdded = 0
IF NOT EXISTS ( SELECT 1
FROM Sys.Columns
WHERE [Object_ID] = Object_ID('DBName.dbo.TableName')
AND Name = 'ColumnName' )
BEGIN
ALTER TABLE TableName ADD ColumnName varchar(120)
SET @CloumnAdded = 1
select @CloumnAdded, 'step 1 '
END
IF ( @CloumnAdded = 1 )
BEGIN
select @CloumnAdded,'step 2'
UPDATE TableName
SET ColumnName = '2669'
select @CloumnAdded,'step 3'
END
GO
Seu problema ocorre devido às diferentes etapas envolvidas na execução da consulta. Primeiro vem a análise, depois a vinculação e, finalmente, a execução. Na análise, o texto enviado é verificado como SQL válido e convertido em uma representação interna. A vinculação resolve os nomes do SQL enviado para objetos dentro do catálogo do SQL Server. Infelizmente
TableName.ColumnName
não existe quando a ligação é tentada para que a parte falhe.Há duas coisas que você pode fazer*. Primeiro, divida a consulta em dois lotes, um para criar a coluna e outro para atualizá-la. Só execute o segundo se o primeiro for bem-sucedido. Em segundo lugar, coloque o
update
SQL dinâmico e execute-o viaexec sp_executesql
. Isso efetivamente cria um segundo lote internamente.*Isso eu posso pensar agora. Tenho certeza que cabeças mais sábias poderiam sugerir outras.