使用While循环进行SQL Server更新

时间:2009-04-15 22:12:49

标签: sql sql-server-2005 loops

我正在努力提高SQL编程的效率。 我试图运行一个循环来重复一个只更改数字后缀的字段名称的更新命令。

例如,不是写出x_1, y_1,而是为每次更新写x_2, y_2

DECLARE @a INT 
DECLARE @b VARCHAR 

SET @a = 1
WHILE @a < 30
set @b = @a
  BEGIN
       UPDATE source set h = h + "x_"+@b
           where "y_"+@b = 'Sold'
    SET @a = @a + 1
  END

如果我能澄清,请告诉我。我正在使用SQL Server 2005。

感谢任何指导。


我正在尝试应用Adams的解决方案,需要了解以下内容的正确用法:

exec sp_executesql update source_temp set pmt_90_day = pmt_90_day + convert(money,'trans_total_'+@b'')
    where convert(datetime,'effective_date_'+@b) <= dateadd(day,90,ORSA_CHARGE_OFF_DATE)
    and DRC_FLAG_'+@b = 'C'

3 个答案:

答案 0 :(得分:8)

这实际上不起作用,因为您不能在引号中使用列名。你实际上在做的是让SQL比较两个总是不同的字符串,这意味着你永远不会执行更新。

如果你必须这样做,你必须有类似......

DECLARE @a INT 
DECLARE @b VARCHAR 
SET @a = 1

WHILE @a < 30
BEGIN
set @b = @a  
exec sp_executesql N'UPDATE source set h = h + 'x_'+@b + N'
           where y_'+@b + N' = ''Sold'''   

SET @a = @a + 1
END

但是,总的来说,我不鼓励这种做法。我不喜欢在任何类型的生产代码的另一个SQL语句中生成动态SQL。对于进行一次性开发任务非常有用,但我不喜欢它可以由用户执行的代码。

答案 1 :(得分:1)

亚当在问题本身上遇到了很多问题,但我要提到这只是一个症状的根本问题。您的数据模型几乎肯定是坏的。如果您计划进行大量(任何)SQL开发,您应该阅读一些关于数据建模的入门书籍。规范化的第一个规则之一是实体不应包含重复组。例如,您不应该有名为“phone_1”,“phone_2”等的列

这是一种更好的模拟这种情况的方法:

CREATE TABLE Contacts (
     contact_id INT NOT NULL,
     contact_name VARCHAR(20) NOT NULL,
     contact_description VARCHAR(500) NULL,
     CONSTRAINT PK_Contacts PRIMARY KEY CLUSTERED (contact_id)
)

CREATE TABLE Contact_Phones (
     contact_id INT NOT NULL,
     phone_type VARCHAR(10) NOT NULL,
     phone_number VARCHAR(20) NOT NULL,
     CONSTRAINT PK_Contact_Phones PRIMARY KEY CLUSTERED (contact_id, phone_type),
     CONSTRAINT CK_Contact_Phones_phone_type CHECK (phone_type IN ('HOME', 'FAX', 'MOBILE'))
)

现在,您不是尝试连接字符串来处理不同的列,而是可以将它们作为一个集合处理,并通过业务逻辑获取您想要的电话号码。 (对不起,我没有使用你的例子,但它似乎有点过于笼统而且难以理解)。

答案 2 :(得分:0)

while @count < @countOfSession
begin
  if @day = 'Saturday' or @day = 'Tuesday'
  begin
    if @day='Saturday'
    begin
      select @date
      set @day='Tuesday'
      set @count=@count+1
      set @date=@date+3
    end
    else if @day='Tuesday'
    begin
      select @date
      set @day='Saturday'
      set @count=@count+1
      set @date=@date+4
    end
  end
end