Запуск условного SQL-скрипта в зависимости от существования базы данных - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь автоматизировать сценарий sql для добавления столбца в существующие базы данных в данной системе. Скрипт будет запущен в системе с одной или другой базой данных. Скрипт не должен вызывать ошибки ни в одном из случаев: 1. Одна из двух баз данных существует 2. Обе базы данных существуют 3. Ни одна база данных не существует.

Я пытался это сделать, но получаю сообщение об ошибке, когда база данных 'DatabaseName' не существует. Я хочу, чтобы сценарий был проигнорирован в этом случае.

IF DB_ID('DatabaseName') IS NOT NULL
    BEGIN
    PRINT 'DatabaseName Exists'
    IF COL_LENGTH('[DatabaseName].[dbo].[Table]', 'NewColumn') IS NULL
        BEGIN
            ALTER TABLE [DatabaseName].[dbo].[Table]
            ADD [NewColumn] bit NOT NULL DEFAULT 0;
            PRINT 'Modified DatabaseName.Table'
        END
    END
ELSE
    BEGIN 
        PRINT 'DatabaseName Does Not Exist' 
        -- therefore do nothing
    END

Это дает мне ошибку:

Msg 2702, Level 16, State 2, Line 6
Database 'DatabaseName' does not exist.

Я также пробовал разные варианты Используйте 'DatabaseName' с такими же или похожими ошибками, потому что они не существуют.

Чтобы уточнить: это нормально, если его не существует. Я просто пытаюсь корректно обработать ошибку, поэтому установка продолжается

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Использовать динамический SQL. Проблема возникает во время фазы компиляции кода. Динамический SQL будет «скрывать» ссылку на базу данных с начальной фазы компиляции.

Например, в SQL Server это выглядит так:

IF COL_LENGTH('[DatabaseName].[dbo].[Table]', 'NewColumn') IS NULL
    BEGIN
        exec sp_executesql N'
ALTER TABLE [DatabaseName].[dbo].[Table]
    ADD [NewColumn] bit NOT NULL DEFAULT 0';
        PRINT 'Modified DatabaseName.Table'
    END
0 голосов
/ 28 августа 2018

Вы можете использовать блок try catch:

BEGIN TRY  
    -- Generate divide-by-zero error.  
    SELECT 1/0;  
END TRY  
BEGIN CATCH  
    -- Execute code if error
END CATCH;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...