SQL Server 2008'de Tablo diğer adıyla UPDATE SQL nasıl yazılır?


213

Çok temelim var UPDATE SQL-

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

Bu sorgu içinde cezası çalıştırır Oracle, Derby, MySQL- ama SQL server 2008 başarısız aşağıdaki hata ile:

"Msg 102, Seviye 15, Durum 1, Satır 1" Q "yakınında yanlış sözdizimi."

Takma adın tüm oluşumlarını kaldırırsam, SQL'den "Q" çalışır.

Ama takma adı kullanmam gerekiyor.


5
Neden takma ad kullanmanız gerekiyor? İhtiyacınız yok gibi görünmüyor.
Mark Byers

5
Evet - programlama açısından buna ihtiyacım yok. Ama tablo takma adları ile her türlü DML SQL'leri üreten varolan / eski bir kütüphane var. Kütüphane, bir tür karmaşık mantığa sahip birçok derse sahiptir. Şimdi kütüphanedeki tablo takma adlarından kurtulmak, mevcut mantığı MSSQL için çalışmak için değiştirmekten daha fazla iştir. Ayrıca birden çok tablo dahil olduğunda, tablo diğer adı olması gerekir.
javauser71

Yanıtlar:


422

SQL Server'da bir güncelleştirme deyiminde takma ad kullanma sözdizimi aşağıdaki gibidir:

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

Yine de burada takma ad gerekli olmamalıdır.


2
Evet !!! İşe yarıyor. Hızlı cevabınız için teşekkür ederim. Neyse ki MSSQL sunucusunun güncelleme için bu tür alışılmamış sözdizimini neden desteklediğini biliyor musunuz?
javauser71

3
Mark Byers - Harika Cevap !! Bu sözdizimi, önce seçimi yaparak güncellemeyi test etmeme izin veren yorumlanmış bir Select deyimi eklememe izin veriyor (aşağıdan SET Q.TITLE = 'TEST' -- SELECT *

2
Güzel. Bu, nerede yan tümcesinde intellisense kullanımını kolaylaştırır.
Magnus

Bu bir takma ad değil. Bu sadece tam nitelikli 'table.column' adı: - /
ScottWelker

18

Her zaman CTE , (Yaygın Tablo İfadesi) yaklaşımını kullanabilirsiniz.

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

UPDATE updateCTE
SET TITLE = 'TEST';

Evet - işe yarıyor. Ancak bir JDBC / Java programı için bu bir tür karmaşık sözdizimidir. Yanıtınız için teşekkürler.
javauser71

-1

Postgres için özel durum

Yukarıdaki Çözümlerin bir listesi benim için işe yaramaz. İşte Postgres için çözüm

Ben ateş olduğum için sorgum

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

Sonuç: HATA: "tablo" ilişkisinin "q" sütunu mevcut değil

Çözüm SET veri değerinde allis kullanmanıza gerek yoktur

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

Merhaba Ronak, cevabınızı Postgres için olduğu gibi indiriyor ve yukarıda T-SQL için zaten çalışan bir çözüm var.
Alpi Murányi

@ AlpiMurányi bana benim durumumda neyin işe yaradığını anlatabilir misiniz? Böylece uygulayabilirim, Cevabımda daha önce bahsedilen Hata
Ronak Patel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.