2009-04-15 2 views
1

Я пытаюсь стать более эффективным в своем программировании на SQL. Я пытаюсь запустить цикл, чтобы повторить команду обновления для имен полей, которые изменяются только с помощью числового суффикса.Использование цикла Loop для SQL Server Update

Например, вместо того, чтобы выписывать 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

+1

@homer: N 'создает nvarchar, а не varchar. Это строковый идентификатор цитирования. Пример: N'This - моя строка '- это nvarchar, и' This is my string 'является varchar. Я использовал N ', потому что sp_executesql принимает nvarchar. –

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

Теперь, вместо того, чтобы пытаться конкатенируйте строку, чтобы иметь дело с разными столбцами, вы можете иметь дело с ними как набор и получить по номерам телефонов, которые вы хотите с помощью бизнес-логики. (Извините, что я не использовал ваш пример, но он казался слишком общим и трудным для понимания).