【问题标题】:SQL Server 2008 Insert with WHILE LOOPSQL Server 2008 使用 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。硬编码。

标签: sql sql-server while-loop


【解决方案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 的解决方案是最好的选择。
猜你喜欢
  • 2012-08-30
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
  • 2015-07-08
  • 2011-05-22
相关资源
最近更新 更多