我正在将数据从一系列旧数据表迁移到新表。在这个过程中,我遇到了一些问题。
我需要创建一个表,将一些数据从旧表复制到新表然后删除旧表。为了实现这一点,我需要编写一个脚本,即使你在迁移的数据库上运行它也不显示错误,这意味着即使旧表不在那里我也不应该看到错误而只是跳过这个过程。
以下是我现在提出的建议:
IF NOT EXISTS(SELECT * FROM sys.objects WHERE Object_ID = Object_ID('Old_Table'))
GOTO Migrated_Before
-- Drop OldTable Indexes, PK's and FK's;
-- CREATE newTable ....;
-- Add Indexes, PK's, Fk's;
-- INSERT INTO NewTable(someFields) FROM OldTable.Fields, OtherTable.Fields ...;
-- DROP OldTable;
Migrated_Before:
这是问题,Drop和Create需要GO才能在继续下一阶段之前提交更改,否则,下一个命令将失败,但是在GOTO和Label之间设置GO将使GOTO的标签未定义。
如何在不多次写IF的情况下继续下一个进程之前强制每个进程运行?
解决方案:我将解决方案留在此处作为其他人的参考。 我在进行下一个语句之前需要发生的每个语句之前添加了begin transaction,例如create table或drop FK。并用begin end(我的第一个解决方案)替换了goto和label
答案 0 :(得分:2)
尝试使用begin transaction
,commit
代替go
答案 1 :(得分:1)
尝试将CREATE,DROP和以下3个命令放在单独的存储过程中,并在GOTO之后调用该过程。该SP将包含所需的GO语句。这可以保持Label的范围不变。
答案 2 :(得分:1)
我可以在没有任何“GO”的情况下运行以下代码
if object_id('abc') is not null
drop table abc
create table abc (asdf varchar(10))
if object_id('abc') is not null
drop table abc
create table abc (asdf varchar(10))
if object_id('abc') is not null
drop table abc
create table abc (asdf varchar(10))
此外,您只需检查null的object_id(),而不是查询sys.objects表。