USE数据库切换后的GOTO标签

时间:2011-01-21 02:57:52

标签: sql-server tsql sql-server-2008

任何人都可以解释为什么会这样:

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”的对象。

这大大简化了,但是这样做可以在两个几乎相同的数据库中为我节省大量重复的表创建

2 个答案:

答案 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)'