2010-02-12 308 views
3

我大概可以谷歌這個,但它似乎有點古怪,它可能是值得作爲SA的答案登錄。如何在SQL Server中的兩列之間交換數據?

因此,在開發用地中,如果要交換兩個變量的值,需要第三個臨時變量。

例如

string x = "ABC"; 
string y = "DEF"; 

string temp; 

temp = x; 
x = y; 
y = temp; 

然而,在SQL更新,你可以簡單地說

UPDATE table 
SET ColumnA = ColumnB, ColumnB = ColumnA 

如何引擎蓋

  • 不SQL Server的下這項工作作爲全行第一的快照?
  • 請問SQL Server是否一次性更新所有正在更新的行?
  • 優化器是否意識到它正在進行列交換,並在幕後製作臨時變量?

乾杯EoinC

回答

4

不SQL Server的解決採取整排第一的快照?

從某種意義上說,是的。

這是一個有趣的場景,它強調了聲明和程序代碼之間的區別。讓我們看看下面的例子:

UPDATE 
    users 
SET 
    first_name = last_name, 
    last_name = first_name, 
    age = 55 
WHERE 
    user_id = 100 

UPDATE聲明會有點像這樣工作:

  • 首先,它會檢查WHERE條款。所有匹配WHERE子句的行都將被標記爲子集。如果沒有WHERE子句,那麼整個表就會被標記。使用上面的例子,我們可以像下面的一個子集:
 
    user_id | first_name | last_name | age | country 
    ---------+--------------+-------------+-------+--------- 
    100  | John  | Doe  | 50 | USA 
  • 然後一個新的子集,從SET條款構成。 SET子句中未提及的字段是從原始子集中複製的。

    新子集中的age字段將直接分配值55first_namelast_name字段也會發生同樣的情況,但它們的新分配值將從原始子集中檢索。 country字段按原樣從原始子集複製,因爲SET子句中沒有提及它。

 
    user_id | first_name | last_name | age | country 
    ---------+--------------+-------------+-------+--------- 
    100  | Doe   | John  | 55 | USA 
  • 原子集,然後從表中刪除與新子集被插入。
2

的SQL命令是不是一個串口,一個接一個地,分步操作之後。這是一次對多個列/行進行的設置操作。

SQL是declarative。你告訴引擎你想要什麼,它是做到了。 你的客戶代碼(也許你的想法)是procedural

最後,可能最好的解釋在於關於「halloween problem」的文章。

注:SQL Server如何管理其內部可能是甲骨文不同,但同樣的問題是由兩個

相關問題