2010-05-08 3 views
0

Я пытаюсь выполнить следующий запрос. У меня нет столбца «CrewID», поэтому в этом случае он пройдет мимо части обновления скрипта. но он дает ошибку Invalid object CrewID '. Не могли бы вы рассказать мне, почему он освобождает часть обновления, даже если условие if не соответствует. Есть ли другой способ сделать то же самое. У меня есть требование, когда нужно переименовать столбец, но перед переименованием мне нужно скопировать данные в другой столбец и нужно много раз вызывать скрипт.Переименовать таблицу Столбец

if exists (select * from syscolumns where name ='CrewID' and id in (select id from dbo.sysobjects where id = object_id(N'[dbo].[WorkPlanAssignees]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)) 
BEGIN 
update A set A.TempCrewID=B.ID from WorkPlanAssignees A inner join Crew B on A.CrewID=B.ID 
END 
+0

, пожалуйста, отформатируйте свой запрос ... – Jonathan

+0

Я думаю, что единственная причина для этого в том, что ваше условие, как это принято, соответствует. Попробуйте заменить часть обновления на предложение печати, чтобы убедиться в этом. – Jonathan

+0

Jonathan, я попробовал с утверждением печати, и он не печатает, что означает, что он не входит в него, если этот блок мне нужен, но в случае утверждения update он пытался его выполнить. – Harendra

ответ

0

SQL не выполняется по строкам. Он составлен как пакет. Во время компиляции столбец не существует. Таким образом, это дает ошибку. IF не имеет значения.

Используйте динамический SQL или сообщите нам, что вы пытаетесь сделать.

И спросил раньше:

Stored Procedure consist Add column, Update data for that column, and Select all data from that table

+0

Спасибо ... да, его ошибка Compiletime. Я думаю, что динамический sql решит мою проблему. – Harendra

0

Я столкнулся с этим же вопросом и обнаружил, что в дополнение к использованию динамического SQL я мог бы решить эту проблему путем перекрестного присоединения к временной таблице, которая имела только одну строку. Это заставило компилятор скрипта не пытаться разрешить переименованный столбец во время компиляции. Ниже приведен пример того, что я сделал, чтобы решить эту проблему без использования динамического SQL

select '1' as SomeText into #dummytable 

update q set q.ValueTXT = convert(varchar(255), q.ValueTXTTMP) from [dbo].[SomeImportantTable] q cross join #dummytable p 
+0

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

0

Сначала вы переименовать старый стол:

ALTER TABLE orig_table_name RENAME TO tmp_table_name; 

Затем создать новую таблицу, на основе старой таблицы, но с обновленное название столбца:

CREATE TABLE orig_table_name (
    col_a INT 
, col_b INT 
); 

Затем скопируйте содержимое напротив оригинальной таблицы.

INSERT INTO orig_table_name(col_a, col_b) 
SELECT col_a, colb 
FROM tmp_table_name; 

Наконец, оставьте старый стол.

DROP TABLE tmp_table_name; 

Обертывание всего этого в НАЧАЛО СДЕЛКИ; и COMMIT; также, вероятно, хорошая идея.

Надеюсь, это поможет.

Смежные вопросы