Создание и использование колонки - PullRequest
4 голосов
/ 11 августа 2010

Я довольно новичок в SQL, поэтому не уверен, является ли это просто компилятором SQL или нет. Когда я использовал SQL до того, как он прошел через JAVA или PHP, я никогда не использовал прямой SQL. Я использую SQL Server 2005 и пытаюсь добавить столбец в таблицу, а затем заполнить его. Вот что у меня сейчас:

ALTER TABLE House DROP COLUMN CustomerType
ALTER TABLE House ADD CustomerType char(11)

UPDATE House
SET CustomerType = CASE
    WHEN ... THEN...
    WHEN ... THEN...
    ELSE "Other"
    END

Однако, когда я пытаюсь скомпилировать это, это приводит к ошибкам, поскольку CustomerType в функции UPDATE еще не определен. Есть ли способ запустить это так, чтобы он скомпилировал и добавил столбец и обновил его, или мне нужно запустить его несколько раз?

Спасибо!

Ответы [ 4 ]

9 голосов
/ 11 августа 2010

Используйте несколько файлов для каждой операции или введите «GO» между шагами:

ALTER TABLE House DROP COLUMN CustomerType
GO

ALTER TABLE House ADD CustomerType char(11)
GO

UPDATE House
SET CustomerType = CASE
    WHEN ... THEN...
    WHEN ... THEN...
    ELSE "Other"
    END
GO

Это работает в SQL Server Management Studio - это не функции T-SQL, а функция Mgmt Studio для разделения "пакетов" T-SQL команд SQL.

Обновление: если вы хотите сделать свой сценарий так, чтобы он мог запускаться несколько раз, более полезным подходом будет проверить наличие столбца и добавить его, только если он не существует пока - нет смысла всегда его сбрасывать и добавлять, если он уже есть!

Для этого используйте что-то вроде:

IF NOT EXISTS(SELECT * FROM sys.columns WHERE name = 'CustomerType' 
                       AND object_id = OBJECT_ID('House'))
   ALTER TABLE dbo.House ADD CustomerType CHAR(11)
GO

Этот фрагмент кода проверяет представление каталога SQL sys.columns, чтобы увидеть, существует ли этот столбец в этой таблице - если нет, он создан. Когда вы запускаете этот код для своей таблицы тысячу раз, первый раз столбец создается, и любой последующий запуск ничего не изменит - поскольку этот столбец уже существует. Гораздо чище, чем постоянно сбрасывать и заново добавлять колонки!

4 голосов
/ 11 августа 2010

Попробуйте поместить оператор GO после второго оператора ALTER и перед вашим оператором UPDATE.

1 голос
/ 11 августа 2010

Там должно быть что-то большее, чем то, что вы показали выше. Я не могу получить очень похожий скрипт на провал; следующие работы просто великолепны:

CREATE TABLE #House (housekey int, number int, street char(20))

insert into #House (housekey, number, street) values (1, 123, 'Wilson Ave')
insert into #House (housekey, number, street) values (2, 124, 'Wilson Ave')
insert into #House (housekey, number, street) values (3, 125, 'Wilson Ave')

alter table #House DROP COLUMN street
alter table #House ADD street varchar(20)

update #House
set street = case
    when number = 123 then 'Wilson Ave'
    when number = 124 then 'Willson Ave'
    when number = 125 then 'Wulson Ave'
    else 'Xxy St'
end

select * from #house

drop table #house

Я думал, что идея разбить сценарий, поставив «GO» после определенных частей, будет эффективной, но когда я запускаю эту вещь, я не могу заставить ее потерпеть неудачу.

Другими словами, «Это работает на моей машине». Есть ли у вас что-нибудь, что может изменить ситуацию?

РЕДАКТИРОВАТЬ ДОБАВИТЬ: Да, GO является ответом. Признаюсь, «это работает на моей машине» - это немного безответственно, потому что вопрос касается не временной таблицы, а обычной. Я решил проблему, используя постоянную таблицу, и получил тот же результат, что и спрашивающий, и GO исправил его. На самом деле это казалось логичным с самого начала.

1 голос
/ 11 августа 2010

Возможно, вам необходимо зафиксировать изменения в схеме до выполнения ОБНОВЛЕНИЯ.

DDL схемы должен быть установлен к тому времени, когда вы перейдете в DML / DQL.Как вы думаете, почему вы должны продолжать отбрасывать и добавлять этот столбец?

...