2011-02-12 17 views
133

Çok basit bir UPDATE SQL'i var -SQL Server 2008'de Table alias ile UPDATE SQL nasıl yazılır?

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

Bu sorgu Oracle, Derby, My-Sql'de sorunsuz çalışıyor - ancak , SQL Server 2008 'da aşağıdaki hata ile başarısız oluyor: "Msg 102, Level 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" sonra çalışır.

Ancak takma adı kullanmam gerekiyor.

+5

Neden bir takma ad kullanmanız gerekiyor? İhtiyacın var gibi görünmüyor. –

+4

Evet - programlama açısından bakıma ihtiyacım yok. Ancak, tablo takma adlarıyla tüm DML SQL'lerini üreten mevcut/eski bir kitaplığım var. Kütüphane, bir çeşit karmaşık mantıkla çok sayıda derse sahiptir. Artık kütüphanede masa takma adlarından kurtulmak, MSSQL için çalışmak için mevcut mantığı düzeltmekten daha çok iş. Ayrıca, birden fazla tablo söz konusu olduğunda, masa takma ad olmalı. – javauser71

cevap

268

SQL Server üzerinde bir güncelleme açıklamada bir takma ad kullanarak sözdizimi şöyledir:

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

takma burada olsa gerekli olmamalıdır.

+2

Evet! İşe yarıyor. Hızlı cevabınız için teşekkür ederim. Herhangi bir ihtimalle MSSQL sunucusunun güncelleme için bu tür geleneksel olmayan sözdizimini neden desteklediğini biliyor musunuz? – javauser71

+1

Mark Byers - Harika! Bu sözdizimi, önce seçim yaparak (aşağıdan aşağıya doğru seçim yaparak ve yürütme yaparak) güncelleme yapmamı sağlayan yorumlanmış bir Seçim ifadesi eklememi sağlar: 'SET Q.TITLE = 'TEST' - SELECT *' –

+1

Nice . Bu, intelliense'i nerede kullanacağınızı daha kolay hale getirir. – Magnus

11

CTE, (Ortak Sekmeli İfade) yaklaşımını her zaman kullanabilirsiniz.

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

UPDATE updateCTE 
SET TITLE = 'TEST'; 
+0

Evet - ayrıca çalışır. Fakat bir JDBC/Java programı için bu bir çeşit karmaşık sözdizimidir. Cevabınız için teşekkürler. – javauser71