【问题标题】:Using While Loop for SQL Server Update使用 While 循环进行 SQL Server 更新
【发布时间】:2009-04-15 22:12:49
【问题描述】:

我正在努力提高我的 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 的解决方案,需要了解以下 N' 的正确用法:

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'

【问题讨论】:

    标签: sql sql-server-2005 loops


    【解决方案1】:

    这实际上不起作用,因为您不能将列名放在引号中。您实际上所做的是让 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。对于完成一次性开发任务非常有用,但我不喜欢可以由用户执行的代码。

    【讨论】:

    • 亚当,如果你能在我的修订方面提供帮助,我将不胜感激。
    • @homer: N' 创建一个 nvarchar,而不是一个 varchar。这是一个字符串引用标识符。例如,N'This is my string' 是 nvarchar,而 'This is my string' 是 varchar。我使用 N' 因为 sp_executesql 需要一个 nvarchar。
    【解决方案2】:

    Adam 对问题本身提出了很多建议,但我要提一下潜在问题,这只是一个症状。你的数据模型几乎肯定是坏的。如果您打算进行大量(任何)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'))
    )
    

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

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

        猜你喜欢
        • 2014-12-07
        • 1970-01-01
        • 2020-03-01
        • 2018-07-19
        • 2018-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多