Использование цикла while для обновления SQL Server - PullRequest
1 голос
/ 16 апреля 2009

Я пытаюсь стать более эффективным в своем программировании на 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.

Спасибо за любые советы.


Я пытаюсь применить решение Адамса, и мне нужно понять, как правильно использовать 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'

Ответы [ 3 ]

8 голосов
/ 16 апреля 2009

На самом деле это не сработает, так как вы не можете указывать имя столбца в кавычках. По сути, вы делаете так, чтобы 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 голос
/ 16 апреля 2009

Адам много обошел вокруг самой проблемы, но я собираюсь упомянуть основную проблему, симптомом которой она является. Ваша модель данных почти наверняка плохая. Если вы планируете заняться (любой) разработкой 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'))
)

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

0 голосов
/ 20 июня 2009
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...