GOTO метка после переключения базы данных USE - PullRequest
3 голосов
/ 21 января 2011

Может кто-нибудь объяснить, почему это работает:

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

Поток правильный, и 2-ая проверка, ЕСЛИ НЕ СУЩЕСТВУЕТ, работает, но когда он пытается создать таблицу, я получаю следующую ошибку

В базе данных уже есть объект с именем «MyTable».

это значительно упрощается, но использование этого избавит меня от множества дублированных созданий таблиц в двух почти идентичных базах данных

Ответы [ 2 ]

1 голос
/ 21 января 2011

Очень странное поведение. Если бы я догадался, я бы сказал, что это контекст «базы данных использования», расположенной в верхней части метки: Я бы никогда не использовал бы метку в T-SQL, кроме вашего вызова.

Выходные данные этого теста показывают, что он проходит правильные движения, но просто безуспешно. Если вы раскомментируете строку с пометкой <<< и прокомментируете строку над ней, она будет работать правильно </p>

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.
0 голосов
/ 21 января 2011

изменить:

создать таблицу MyTable (MyColumn int не нуль)

в:

exec sp_executesql N'создать таблицу MyTable(MyColumn int not null) '

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...