Ошибка с приведенным ниже сценарием - PullRequest
2 голосов
/ 22 августа 2011

Я выполняю следующую операцию. Я получаю сообщение об ошибке и не могу найти его. Может ли кто-нибудь помочь мне найти его. а) Проверить наличие базы данных DESTINATION. Если он не существует, создайте базу данных и переместите таблицы в базу данных. б) Если таблица существует в базе данных DESTINATION, то для этой таблицы не требуется никакой обработки.

if db_id('Destination')is null
begin
Create database Destination
select * into TabDestination from [Source].[dbo].[TabSource]
end 
else
begin
use Destination
go
if('TabDestination' in (select name from sys.objects where type = 'u'))
insert into TabDestination select * from [Source].[dbo].[TabSource]
end

Я получаю следующую ошибку

Msg 911, Level 16, State 1, Line 8
Database 'Destination' does not exist. Make sure that the name is entered correctly.
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near 'end'.

Ответы [ 4 ]

3 голосов
/ 22 августа 2011

Ваша проблема с USE, из документации:

USE выполняется как во время компиляции, так и во время выполнения ...

Если указанная база данных не существует во время компиляции, запрос не будет выполнен. Это можно увидеть, выполнив следующий запрос:

IF 1 = 2
BEGIN
    USE NonexistantDatabase
END

Этот запрос не выполняется, несмотря на то, что оператор USE никогда не выполняется.

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

INSERT INTO Destination.dbo.Table SELECT * FROM Source.dbo.Table
1 голос
/ 22 августа 2011

Вариант ответа @Jon Egerton, однако есть один случай, который вы забыли охватить: база данных существует, а таблицы нет.

DECLARE @sql NVARCHAR(MAX) = N'SELECT * 
    INTO Destination.dbo.TabDestination 
    FROM Source.dbo.TabSource;';

IF DB_ID('Destination') IS NULL
BEGIN
    PRINT 'Creating database...';
    CREATE DATABASE Destination;
    PRINT 'Selecting into new table...';
    EXEC sp_executeSQL @sql;
END
ELSE
BEGIN
    IF EXISTS (SELECT 1 FROM Destination.sys.tables WHERE schema_id = 1 
        AND name = N'TabDestination')
    BEGIN
        PRINT 'Inserting into existing table...';
        INSERT Destination.dbo.TabDestination SELECT * FROM Source.dbo.TabSource;
    END
    ELSE
    BEGIN
        PRINT 'Selecting into new table...';
        EXEC sp_executeSQL @sql;
    END
END

EDIT

Добавлены PRINT операторы для целей отладки, как я предложил в продолжении ответа @ Jon.

1 голос
/ 22 августа 2011

Здесь несколько проблем:

  • После Create database Destination вам нужно использовать эту базу данных перед тем, как вы выполните select * into TabDestination..., поскольку вы создадите TabDestination в другой БД.
  • Go в середине блока begin...end не будет работать.
  • Чтобы указать свою базу данных для вставок в TabDesitination, вам лучше использовать полное имя таблицы, чем вызыватьUse, например, Insert Destiation.dbo.TabDestination...
  • Вам необходимо использовать If Exists (select... для второго оператора if.
  • Поскольку ваша база данных может не существовать, когда скрипт компилируется, большая часть sql нуждаетсябыть динамически исполняемым.

Таким образом, ваш сценарий может быть переписан как:

if db_id('Destination')is null
begin
    Create database Destination    
    exec ('select * into Destination.dbo.TabDestination from [Source].[dbo].[TabSource]')
end 
else
begin

    if exists (select name from Destination.sys.objects where name = 'TabDestination' and type = 'u')
    insert into Destination.dbo.TabDestination select * from [Source].[dbo].[TabSource]

end
0 голосов
/ 23 августа 2011

Вам просто нужно избавиться от команды GO, ее разделителя пакетов, чтобы он ломал начало / конец.Да, и вы тоже не можете использовать USE.

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