重命名表列

时间:2010-05-08 09:23:49

标签: sql-server tsql rename

我正在尝试执行以下查询。我没有'CrewID'列,因此在这种情况下它将通过更新脚本的一部分。但它给出了错误无效的对象CrewID'。你可以告诉我为什么它会执行更新部分甚至我的条件不匹配。还有另一种方法可以做同样的事情。我有需要重命名列的要求但在重命名之前我必须在其他列中复制数据并需要多次执行脚本。

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

3 个答案:

答案 0 :(得分:0)

SQL不是逐行执行的。它被编译为批处理。在编译时,该列不存在。所以它给出了一个错误。 IF无关紧要。

使用动态SQL或告诉我们您要做的事情。

之前问过:

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

答案 1 :(得分: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

答案 2 :(得分: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;

在BEGIN TRANSACTION中包含所有这些内容;和COMMIT;也可能是一个好主意。

希望它有所帮助。