2013-03-03 66 views
6

hồ sơ tôi đã hiện hữu nhưSQL Server 2008 Insert với vòng lặp while

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

tôi cần phải sử dụng một vòng lặp while để chèn hàng với Bệnh viện ID thay đổi một giá trị cụ thể hoặc 32 trong trường hợp này, trong khi những người khác (không phải ID vì nó được tạo tự động) hằng số còn lại.

Nó sau đó sẽ giống như

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 

Thông báo nêu trên hiện nay có hai hàng mới với ID và Bệnh viện ID khác nhau. ID được tạo tự động.

Tôi có một số bảng nơi tôi cần thực hiện các cập nhật tương tự. Tôi không muốn sử dụng con trỏ nếu tôi có thể làm điều này với một vòng lặp while.

EDIT Vòng lặp trong khi giải pháp đơn giản hơn được cung cấp trong câu trả lời được chấp nhận.

+1

Bạn đã thử bất cứ điều gì chưa? – peterm

+0

Tất nhiên. Tôi không biết cách viết truy vấn chèn. Tôi đã thử khai báo @hospitalid int và looping với vòng lặp while với @@ RowCount. – Mukus

+0

Đặt một số mã ở đây. – navi

Trả lời

12

Giả sử rằng ID là một cột sắc:

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

Cố gắng tránh các vòng lặp với SQL. Cố gắng suy nghĩ về mặt bộ thay thế.

+0

Điều đó chỉ hoạt động. Cảm ơn bạn. Chỉ cần tò mò để tìm hiểu mặc dù, bạn có thể nghĩ ra một cách để làm với WHILE LOOP? điều đó có nghĩa là tạo ra một bảng tạm thời để lưu trữ các giá trị temp? – Mukus

+3

Tôi sẽ không bao giờ sử dụng vòng lặp 'WHILE'. Bất cứ khi nào tôi tìm thấy tự mình sử dụng mã như thế, tôi dừng lại những gì tôi đang làm và bắt đầu lại. –

19

Trước hết tôi muốn nói rằng tôi 100% đồng ý với John Saunders rằng bạn phải tránh các vòng lặp trong SQL trong hầu hết các trường hợp, đặc biệt là trong sản xuất.

Nhưng đôi khi là một điều một lần để điền vào một bảng với một trăm bản ghi cho mục đích thử nghiệm IMHO nó chỉ OK để thưởng thức bản thân để sử dụng một vòng lặp.

Ví dụ trong trường hợp của bạn để cư bảng của bạn với hồ sơ với id bệnh viện từ 16 đến 100 và làm email và giới thiệu riêng biệt mà bạn có thể đã sử dụng

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 

Và kết quả sẽ là

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

Câu trả lời được chấp nhận được sửa đổi một chút là những gì tôi đang tìm kiếm. Tôi đã không cố gắng tăng HospitalID. Câu hỏi của tôi cho thấy ví dụ về những gì tôi đang tìm kiếm. – Mukus

+0

@TejaswiRana Câu hỏi cho thấy ví dụ nhưng không có ý định đằng sau nó. Bạn có thể sử dụng giá trị const cho HospitalID '32' trong ví dụ của tôi nếu bạn muốn. Nhưng nếu bạn muốn chỉ sao chép tập hợp các bản ghi hiện tại chính xác như chúng trong khi thay đổi giá trị của một cột thì giải pháp @JohnSaunders là cách tốt nhất để đi. – peterm

Các vấn đề liên quan