Pergunta

Eu tenho um script SQL em que estou trabalhando e encontro um problema ao criar (ou editar) uma coluna e, em seguida, tentando modificar essa nova coluna.

Por exemplo:

BEGIN
    ALTER TABLE SampleTable ADD ColumnThree int 
END

IF (EXISTS (SELECT * FROM sys.columns WHERE name = 'ColumnThree'))
BEGIN
    UPDATE SampleTable SET ColumnThree = 0
END

Agora eu pensei que os blocos iniciantes/end separariam esses dois itens, mas recebo um erro "Nome da coluna inválida 'ColumnThree'". Quando tento executar isso. Por quê? Não deve ser o primeiro início/final, não deve ser configurado na coluna e mais ao ponto em que o if (existe deve proteger a declaração de atualização de ser executada se esse nome de coluna não existir.

Qual é a maneira correta de fazer algo assim? (Parece que tenho alguns cenários semelhantes onde isso é necessário).

Foi útil?

Solução

Você precisa GO, não BEGIN/END. Além disso, você pode querer editar seu EXISTS Consulte um pouco para garantir que você esteja recebendo a tabela certa:

ALTER TABLE SampleTable ADD ColumnThree int 
GO

IF (EXISTS 
        (SELECT 1 
         FROM 
             sys.columns c 
             INNER JOIN sys.tables t ON 
                 c.object_id = t.object_id 
         WHERE 
             t.name = 'SampleTable' 
             AND c.name = 'ColumnThree'))
BEGIN
    UPDATE SampleTable SET ColumnThree = 0
END

Se você estiver usando vários esquemas, você deseja passar sys.schemas no cheque também.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top