2010-05-08 122 views
0

我想执行以下查询。我没有'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 
+0

请格式化您的查询... – Jonathan 2010-05-08 09:28:35

+0

我认为这是唯一的原因是,您的条件,如writed,匹配。尝试用打印句子替换更新部分以确保它。 – Jonathan 2010-05-08 09:34:26

+0

Jonathan,我试着用print语句,它不打印,这意味着它不会进入如果块是我想要的,但在更新语句的情况下,它试图执行它。 – Harendra 2010-05-08 09:53:02

回答

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

这有时会起作用(因为对不存在的表的引用会触发延迟编译),但我发现它不可靠。有时解析器似乎在到达不存在的表之前处理(并错误)不存在的列。 – 2012-08-21 17:26:59

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;也可能是一个好主意。

希望它有帮助。