2013-03-03 64 views
6

我有現有的記錄,像SQL Server 2008中插入與WHILE LOOP

ID Hospital ID  Email    Description 
1  15   [email protected]   Sample Description 
2  15   [email protected]   Random Text 

我需要使用循環插入與醫院ID改爲在這種情況下,一個特定的值或32行,而其他(不是ID,因爲它是自動生成的)保持不變。

應該再像

ID Hospital ID  Email    Description 
1  15   [email protected]   Sample Description 
2  15   [email protected]   Random Text 
3  32   [email protected]   Sample Description 
4  32   [email protected]   Random Text 

注意上面現在有ID和醫院ID不同的兩個新行。 ID是自動生成的。

我有幾個表,我需要做出相同的更新。如果我可以用while循環來做這件事,我不想使用光標。

編輯 在接受的答案中提供了作爲更簡單的解決方案被遺棄的while循環。

+1

你有沒有嘗試過什麼? – peterm 2013-03-03 04:36:38

+0

當然。我不知道如何編寫插入查詢。我試着聲明@hospitalid int並用@@ RowCount用while循環進行循環。 – Mukus 2013-03-03 04:38:41

+0

在這裏輸入一些代碼。 – navi 2013-03-03 04:39:49

回答

12

假設ID是標識列:

INSERT INTO TheTable(HospitalID, Email, Description) 
SELECT 32, Email, Description FROM TheTable 
WHERE HospitalID <> 32 

儘量避免與SQL循環。嘗試用套來思考。

+0

這只是工作。謝謝。雖然只是好奇學習,你可以想辦法處理WHILE LOOP嗎?這是否意味着創建一個臨時表來存儲臨時值? – Mukus 2013-03-03 05:06:02

+3

我永遠不會使用'WHILE'循環。每當我發現自己使用這樣的代碼時,我就停止了我正在做的事情並重新開始。 – 2013-03-03 05:08:32

19

首先我想說的是,我完全同意John Saunders的觀點,即在大多數情況下,尤其是在生產環境中,您必須避免SQL中出現循環。

但偶爾作爲一次性的事情來填充一張表有一百個記錄用於測試目的恕我直言,這只是放縱自己使用循環。

例如你的情況來填充你的表16和100之間,醫院IDS記錄,以電子郵件和描述不同,你可能已經使用

CREATE PROCEDURE populateHospitals 
AS 
DECLARE @hid INT; 
SET @hid=16; 
WHILE @hid < 100 
BEGIN 
    INSERT hospitals ([Hospital ID], Email, Description) 
    VALUES(@hid, 'user' + LTRIM(STR(@hid)) + '@mail.com', 'Sample Description' + LTRIM(STR(@hid))); 
    SET @hid = @hid + 1; 
END 

而且結果將是

ID Hospital ID Email   Description   
---- ----------- ---------------- --------------------- 
1 16   [email protected] Sample Description16 
2 17   [email protected] Sample Description17 
...              
84 99   [email protected] Sample Description99 
+0

接受的答案略有修改,我正在尋找。我並沒有試圖增加HospitalID。我的問題顯示了我期待得到的例子。 – Mukus 2013-03-03 08:21:09

+0

@TejaswiRana這個問題顯示的例子,但不是背後的意圖。如果你願意,你可以在我的例子中爲HospitalID'32'使用const值。但是,如果您只想在改變一列的值的情況下完全按原樣複製現有記錄集,那麼@JohnSaunders的解決方案是最好的選擇。 – peterm 2013-03-03 08:48:26