2017-04-11 99 views
0

我想在一個時間,其中列B依賴於A列中更新表的兩列SQL - 更新兩列,其中一個是依賴於其他

之前更新

ColA ColB 

A11 NULL 

B22 NULL 

C33 NULL 

D44 NULL 

更新後

ColA ColB 

11 A 

22 B 

33 C 

44 D 

我writning更新語句

UPDATE tbl SET ColA = STUFF(ColA,1,1,''), ColB = LEFT(ColA, 1) 

這裏ColB應該在ColA之前更新,它對於小的結果集正常工作。但是,如果有大量記錄,它將如何表現? SQL更新是否隨機發生?

我真的不確定它是否只會在ColB更新完成時更新ColA。這可以通過CTE來實現,但是我想知道更新在這裏是如何工作的。

+0

你應該寫一個函數或觸發器爲這個 – iPhantomGuy

+0

我有我的查詢,完美的作品即。使用CTE。我想知道ColA有沒有機會在ColB之前更新一行? –

回答

0
BEGIN TRAN 
Create Table #Temp (ColA NVARCHAR(10),ColB NVARCHAR(10)) 

INSERT INTO #Temp 
SELECT 'A11', NULL UNION ALL 
SELECT 'B22', NULL UNION ALL 
SELECT 'C33', NULL UNION ALL 
SELECT 'D44' , NULL 


SELECT * FROM #Temp 
UPDATE #Temp SET ColA=SUBSTRING(ColA,2,2),ColB=SUBSTRING(ColA,1,1) 

SELECT * FROM #Temp 
ROLLBACK TRAN 
+0

感謝您的回覆。這也可以使用CTE來實現。我關心的是上面所述的單一更新聲明。這會有什麼問題嗎? –

+0

否不會有任何問題如果您不確定採取臨時表中的更改並檢查它。如果一切正常,您可以在User_Table中進行更改.. –

0

根本沒有問題。 SQL是聲明式的,會使你的語句以某種方式工作。

對於笑(或建立信任)嘗試SET a=b, b=a

這將交換價值雖然到程序的心態它不應該。