SQL Server 2008中的带有WHILE循环的插入操作

5

我已有类似以下格式的记录

ID    Hospital ID     Email                Description 
1       15         abc@e.com           Sample Description
2       15         def@dd.com          Random Text

我需要使用 WHILE 循环插入行,使医院 ID 更改为特定值或 32(在此情况下),而其他内容(不包括 ID,因为它是自动生成的)保持不变。然后它应该看起来像这样:
ID    Hospital ID     Email                Description 
1       15         abc@e.com           Sample Description
2       15         def@dd.com          Random Text
3       32         abc@e.com           Sample Description
4       32         def@dd.com          Random Text

请注意上面现在有两行新的ID和医院ID。ID是自动生成的。

我有几个表格需要进行相同的更新。如果可以用while循环完成,我就不想使用游标。

编辑 由于已被接受的答案提供了更简单的解决方案,因此放弃了while循环。


1
你有尝试过什么吗? - peterm
当然。我不知道如何编写插入查询语句。我尝试声明@hospitalid int并使用while循环和@@RowCount进行循环。 - Mukus
在这里放入一些代码。 - navi
HospitalID 的值来自哪里? - John Woo
我正在自己设置新的医院ID。硬编码。 - Mukus
显示剩余3条评论
2个回答

21

首先,我想说我完全同意John Saunders的观点,在大多数情况下特别是在生产环境中,必须避免在SQL中使用循环。

但是偶尔为了测试目的而一次性填充表格中的一百条记录,我认为使用循环是可以的。

例如,在您的情况下,为了填充具有医院ID在16和100之间的记录,并使电子邮件和描述不同,您可以使用以下代码:

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          user16@mail.com  Sample Description16 
2    17          user17@mail.com  Sample Description17 
...                                                    
84   99          user99@mail.com  Sample Description99 

被接受的答案稍作修改就能实现我想要的功能。我并不是试图增加HospitalID。我的问题展示了我想要得到的例子。 - Mukus
@TejaswiRana 这个问题只是提供了一个例子,但并没有表达其背后的意图。如果你愿意,可以在我的例子中使用常量值 32 作为 HospitalID。但是,如果你想要完全复制现有记录集并同时更改其中一列的值,那么 @JohnSaunders 的解决方案是最好的选择。 - peterm

12
假设 ID 是一个标识列:
INSERT INTO TheTable(HospitalID, Email, Description)
SELECT 32, Email, Description FROM TheTable
WHERE HospitalID <> 32

尽量避免在SQL中使用循环。尝试用集合的思维方式来思考。


那很好用。谢谢。只是好奇想学习一下,你能想到用 WHILE LOOP 的方法吗?这是否意味着创建一个临时表来存储临时值? - Mukus
3
我从不使用“WHILE”循环。每当我发现自己写了这样的代码,就会停下来重新开始。 - John Saunders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接