Como escrever UPDATE SQL com alias de tabela no SQL Server 2008?

212

Eu tenho um muito básico UPDATE SQL-

UPDATE HOLD_TABLE Q SET Q.TITLE = 'TEST' WHERE Q.ID = 101;

Esta consulta funciona muito bem em Oracle, Derby, MySQL- mas não no servidor SQL Server 2008 com o seguinte erro:

"Mensagem 102, Nível 15, Estado 1, Linha 1 Sintaxe incorreta perto de 'Q'."

Se eu remover todas as ocorrências do alias, "Q" do SQL, ele funcionará.

Mas eu preciso usar o alias.

javauser71
fonte
5
Por que você precisa usar um alias? Não parece que você precise.
Mark Byers
5
Sim - da perspectiva da programação, não preciso disso. Mas eu tenho uma biblioteca existente / antiga que gera todo tipo de SQL DML com alias de tabela. A biblioteca possui muitas classes com um tipo de lógica complexa. Agora, livrar-se de aliases de tabela na biblioteca é mais trabalho do que ajustar a lógica existente para trabalhar com o MSSQL. Além disso, quando várias tabelas estão envolvidas, eu preciso ter um alias de tabela.
Javauser71

Respostas:

421

A sintaxe para usar um alias em uma instrução de atualização no SQL Server é a seguinte:

UPDATE Q
SET Q.TITLE = 'TEST'
FROM HOLD_TABLE Q
WHERE Q.ID = 101;

O alias não deve ser necessário aqui.

Mark Byers
fonte
2
Sim !!! Funciona. Obrigado pela resposta rápida. Por acaso, você sabe por que o servidor MSSQL suporta uma sintaxe não convencional para atualização?
Javauser71
3
Mark Byers - Ótima resposta !! Esta sintaxe permite-me adicionar uma comentada declaração Select, o que me permite testar a atualização, fazendo o seleccionar primeiro (destaque da escolha para baixo e executar):SET Q.TITLE = 'TEST' -- SELECT *
2
Agradável. Isso facilita o uso do intellisense na cláusula where.
Magnus
Isso não é um apelido. Esse é apenas o nome 'table.column' totalmente qualificado: - /
ScottWelker 23/04
17

Você sempre pode usar a abordagem CTE (Expressão tabular comum).

;WITH updateCTE AS
(
    SELECT ID, TITLE 
    FROM HOLD_TABLE
    WHERE ID = 101
)

UPDATE updateCTE
SET TITLE = 'TEST';
Ryk
fonte
Sim - também funciona. Mas para um programa JDBC / Java, esse é um tipo de sintaxe complexa. Obrigado pela sua resposta.
Javauser71
-1

Caso especial para o Postgres

Uma lista das soluções acima não funcionaria para mim. Então, aqui a solução para o Postgres

Como eu sou um incêndio minha consulta

UPDATE table Q SET Q.is_active = FALSE ,Q.is_delete = TRUE WHERE Q.name = 'XYZ';

Resultado: ERRO: a coluna "q" da relação "tabela" não existe

Solução Seria que você não precisa usar allis no valor de dados SET

UPDATE table Q SET is_active = FALSE ,is_delete = TRUE WHERE Q.name = 'XYZ';
Ronak Patel
fonte
Oi Ronak, votando negativamente sua resposta como é para o Postgres e já existe uma solução funcional para o T-SQL acima.
Alpi Murányi 11/06
hii @ AlpiMurányi, você pode me sugerir qual é a solução que funciona no meu caso. para que eu possa implementar, já mencionei Error na minha resposta
Ronak Patel