SQL Server 2008 使用 WHILE LOOP 插入

Posted

技术标签:

【中文标题】SQL Server 2008 使用 WHILE LOOP 插入【英文标题】:SQL Server 2008 Insert with WHILE LOOP 【发布时间】:2013-02-17 09:56:35 【问题描述】:

我有类似的现有记录

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 循环作为更简单的解决方案。

【问题讨论】:

你有没有尝试过? 当然。我不知道如何编写插入查询。我尝试用@@RowCount 声明@hospitalid int 和while 循环。 在这里输入一些代码。 HospitalID的值是从哪里来的? 我正在自己设置新的 HospitalID。硬编码。 【参考方案1】:

假设ID 是一个标识列:

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

尽量避免 SQL 循环。试着用集合来思考。

【讨论】:

这行得通。谢谢你。不过只是好奇地学习,你能想出一种方法来处理 WHILE LOOP 吗?这是否意味着创建一个临时表来存储临时值? 我永远不会使用WHILE 循环。每当我发现自己在使用这样的代码时,我就会停止我正在做的事情并重新开始。【参考方案2】:

首先我想说的是,我 100% 同意 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。我的问题显示了我想要得到的示例。 @TejaswiRana 该问题显示了示例,但背后没有意图。如果您愿意,可以在我的示例中为 HospitalID 32 使用 const 值。但是,如果您想在更改一列的值的同时完全复制现有记录集,那么@JohnSaunders 的解决方案是最好的选择。

以上是关于SQL Server 2008 使用 WHILE LOOP 插入的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 中的 While 循环遍历日期范围,然后插入

SQL Server 2008 中的截断/清除表变量

您如何使用 SQL Server CE 和 SQL Server 2008 Express?

使用 SQL Server 2008 和 SQL Server 2005 和日期时间

如何用SQL SERVER 2005连接SQL SERVER 2008

安装SQL SERVER 2008,出现“查找sql server 2008安装媒体”的问题