任何人都可以解释为什么会这样:
use MyDb1
if NOT EXISTS (select * from sys.objects where name = 'MyTable' and type = 'U' )
create table MyTable(MyColumn int not null)
use MyDb2
if NOT EXISTS (select * from sys.objects where name = 'MyTable' and type = 'U' )
create table MyTable(MyColumn int not null)
但这不是:
use MyDb1
mylabel:
if NOT EXISTS (select * from sys.objects where name = 'MyTable' and type = 'U' )
create table MyTable(MyColumn int not null)
if(DB_NAME()='MyDb1')
begin
use MyDb2
goto mylabel
end
流程是正确的,第二次检查IF NOT EXISTS是否有效但是当它试图创建表时我收到以下错误
数据库中已有一个名为“MyTable”的对象。
这大大简化了,但是这样做可以在两个几乎相同的数据库中为我节省大量重复的表创建
答案 0 :(得分:1)
非常奇怪的行为。如果我猜测,我会说这是位于标签顶部的“使用数据库”的上下文:我从不在T-SQL中使用标签,但是你的电话。
此测试的输出表明它正在通过正确的动作,但是没有任何理由失败。如果取消注释标记为<<<<并评论上面的一个,然后它正常工作
set nocount on
use tempdb
create database db1
create database db2
GO
use db1
mylabel:
print 'in-' + db_name()
if NOT EXISTS (select * from sys.objects where name = 'MyTable' and type = 'U' )
begin
print 'create-' + db_name()
create table MyTable(MyColumn int not null)
-- exec ('create table MyTable(MyColumn int not null)') -- <<<
end
if(DB_NAME()='db1')
begin
print 'switch'
use db2
goto mylabel
end
GO
use tempdb
drop database db1
drop database db2
输出:
in-db1
create-db1
switch
in-db2
create-db2
Msg 2714, Level 16, State 6, Line 9
There is already an object named 'MyTable' in the database.
答案 1 :(得分:0)
变化:
创建表MyTable(MyColumn int not null)
为:
exec sp_executesql N'create table MyTable(MyColumn int not null)'