Есть ли SQL-эквивалент возврата?

Рассмотрим следующий бит SQL

    SET DATEFORMAT ymd
SET ARITHABORT, ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER, ANSI_NULLS, NOCOUNT ON
SET NUMERIC_ROUNDABORT, IMPLICIT_TRANSACTIONS, XACT_ABORT OFF
GO
USE master
GO

IF DB_NAME() <> N'master' SET NOEXEC ON

--
-- Create database [myDatabaseName]
--
PRINT (N'Create database [myDatabaseName]')
GO
CREATE DATABASE myDatabaseName

Затем существует очень длинный сценарий настройки таблиц, представлений, хранимых процедур и т. Д. И т. Д.

Я хотел бы знать, разрешит ли SQL что-то подобное следующему псевдокоду;

If (myDatabaseName Exists)
     Return  // in other word abort the script here but don't throw an error
Else
 //Carry on and install the database

Мне известна функция Exists в SQL, но я не могу найти ничего, что могло бы сразу прервать остатки скрипта.

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

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

3 ответа

Решение

Проблема в том, что ваш клиентский инструмент (SSMS, SQLCMd и т. Д.) Разбивает ваш скрипт на пакеты в зависимости от местоположения GO ключевое слово (это инструмент клиента, а не SQL Server).

Затем он отправляет первую партию. После завершения первой партии (независимо от результата) она отправляет вторую партию, затем третью после второй и т. Д.

Если вы работаете с достаточными разрешениями, высоко ценится RAISERROR (уровень серьезности 20-25) должен остановить клиентский инструмент на своем пути (потому что он принудительно закрывает соединение). Это не так чисто, хотя.

Другой вариант, чтобы попытаться установить NOEXEC ON который все еще выполняет некоторую работу с каждым последующим пакетом (компиляцией), но не запускает какой-либо код 1. Это дает вам немного лучший вариант восстановления, если вы хотите, чтобы некоторые партии в конце всегда запускались, поворачивая его OFF снова.


1 Это означает, что вы по-прежнему будете видеть сообщения об ошибках для ошибок компиляции для более поздних пакетов, которые основаны на структурах базы данных, которые были бы созданы в более ранних пакетах, если бы они не были пропущены.

Вы можете использовать GOTO следующим образом:

If (myDatabaseName Exists)
     GOTO QUIT;  // in other word abort the script here but don't throw an error
Else
 //Carry on and install the database

QUIT:
  SELECT 0;

Существует несколько методов для такого запроса:

raiserror('Oh no a fatal error', 20, -1) with log

ИЛИ ЖЕ

print 'Fatal error, script will not continue!'
set noexec on

Они должны работать и закрыть соединение.

Смотрите здесь: Ответ

Другие вопросы по тегам