2009-04-15 53 views
1

我试图在SQL编程中变得更高效。 我想运行一个循环来重复更新命令的字段名称只能通过数字后缀更改。使用While循环进行SQL Server更新

例如,而不是每次更新写出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_"[email protected] 
      where "y_"[email protected] = 'Sold' 
    SET @a = @a + 1 
    END 

让我知道如果我可以澄清。我正在使用SQL Server 2005.

感谢您的任何指导。


我想申请亚当斯的解决方案,需要了解什么是在N”正确用法如下:

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

回答

6

事实上这并不会工作,因为你不能有列名在引号中。你实际上做的是让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_'[email protected] + N' 
      where y_'[email protected] + N' = ''Sold''' 

SET @a = @a + 1 
END 

但一般情况下,我会鼓励这种做法。我不是在另一个SQL语句内为任何类型的生产代码生成动态SQL的粉丝。对于做一次性开发任务非常有用,但我不喜欢它可以由用户执行的代码。

+0

亚当,如果你能协助我对我的修订的问候,我将不胜感激。 – homerjay 2009-04-16 15:08:09

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')) 
) 

现在,连接字符串以处理不同的列,您可以将它们作为一组处理,并通过业务逻辑获取所需的电话号码。 (对不起,我没有使用你的例子,但它似乎有点太笼统,很难理解)。