WedX - журнал о программировании и компьютерных науках

Если таблица sql существует, создайте

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

Неправильный синтаксис рядом с ")".

IF NOT EXISTS (SELECT 'X'
               FROM INFORMATION_SCHEMA.TABLES
               WHERE TABLE_NAME = 'table_name'
                 AND TABLE_SCHEMA = 'schema')
BEGIN
    // create..
END

Мой код

IF NOT EXISTS (SELECT *
               FROM INFORMATION_SCHEMA.TABLES
               WHERE TABLE_NAME = 'control_forecastscenario'
                 AND TABLE_SCHEMA = 'rvfc')
BEGIN
    CREATE TABLE [rvfc].[control_forecastscenario]
    (
        [Scenario] [varchar](255) NULL,
        [Active] [varchar](255) NULL
    ) ON [PRIMARY]

Ошибка находится в строке 4

AND TABLE_SCHEMA = 'rvfc')
sql
16.04.2021

  • Похоже, вам нужно завершить блок BEGIN с помощью оператора END. В противном случае заявление прошло для меня нормально. 17.04.2021
  • И, конечно, вам нужно заранее создать свою схему rvfc 17.04.2021
  • @RexHenderson, спасибо, быстрый вопрос, как вы думаете, этого метода или включения триггера будет более достаточно 17.04.2021
  • Я не понимаю, каковы ваши цели, но по возможности держитесь подальше от триггеров. 17.04.2021
  • Когда ОП разъяснит свои цели, я дам лучший ответ. Спасибо 17.04.2021
  • Ваш синтаксис, который вы разместили здесь, является правильным для MS SQL, он не воспроизводится, поскольку он отображается, вы выполняете это из студии управления или из сценария или процедуры кода? 17.04.2021
  • @ChrisSchaller Я работаю в Microsoft Azure Studio 17.04.2021
  • Итак, @ Yigan32, это все еще проблема? Ошибка предполагает, что выполняется только часть вашего запроса, но с предоставленной информацией мы не можем воспроизвести проблему. IF NOT EXISTS ... BEGIN... CREATE TABLE ... END - очень распространенный шаблон многократного использования для сценариев DDL, похоже, вы делаете правильные вещи. 18.04.2021
  • @ChrisSchaller единственная проблема, которая у меня все еще есть, - это ON PRIMARY, я должен держать ее в коде, но я получаю неправильный синтаксис на Primary 19.04.2021
  • У вас есть инструкция END после ON PRIMARY? Ошибка означает, что что-то сразу после нее неверно. Но опять же, это очень странно, есть кое-что, что вы не публикуете, потому что то, что вы опубликовали, действительно работает в ванильной среде. 19.04.2021

Ответы:


1

Как единый запрос, синтаксис, который вы разместили, отлично работает. Вы не включили END в свой BEGIN блок в сообщении, но мы знаем, что проблема не в этом, потому что в сообщении об ошибке должен был быть другой номер строки.

Следующее единственное выражение будет работать:
(мне нравится делать отступ для BEGIN, но это не влияет на выполнение)

IF NOT EXISTS (SELECT *
    FROM   INFORMATION_SCHEMA.TABLES
    WHERE  TABLE_NAME = 'control_forecastscenario'
    AND TABLE_SCHEMA = 'rvfc')
BEGIN
    CREATE TABLE [rvfc].[control_forecastscenario](
        [Scenario] [varchar](255) NULL,
        [Active] [varchar](255) NULL
    )
END

Также обратите внимание, что я пропустил ON [PRIMARY], поскольку это группа файлов по умолчанию, и если вы не управляете несколькими файлами групп, то лучше не включать ссылки на них в базу кода.

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

Следующее создаст вашу ошибку.

IF NOT EXISTS (SELECT *
    FROM   INFORMATION_SCHEMA.TABLES
    WHERE  TABLE_NAME = 'control_forecastscenario'
    AND TABLE_SCHEMA = 'rvfc')

Сообщение 102, уровень 15, состояние 1, строка 4
Неправильный синтаксис рядом с ")".

Та же ошибка возникнет, если в исходный скрипт ввести символьное двоеточие.

IF NOT EXISTS (SELECT *
    FROM   INFORMATION_SCHEMA.TABLES
    WHERE  TABLE_NAME = 'control_forecastscenario'
    AND TABLE_SCHEMA = 'rvfc')
;
BEGIN
CREATE TABLE [rvfc].[control_forecastscenario](
    [Scenario] [varchar](255) NULL,
    [Active] [varchar](255) NULL
    )
END

При рассмотрении некоторых других комментариев существование схемы rvfc здесь не ставится под сомнение, равно как и другие распространенные проблемы синтаксиса, потому что они могут вызывать разные сообщения об ошибках, подобные этому:

Сообщение 2760, уровень 16, состояние 1, строка 7
Указанное имя схемы rvfc либо не существует, либо у вас нет разрешения на его использование.

Если вы выполнили этот оператор, опуская END, вы увидите другой номер строки, но такое же сообщение:

IF NOT EXISTS (SELECT *
    FROM   INFORMATION_SCHEMA.TABLES
    WHERE  TABLE_NAME = 'control_forecastscenario'
    AND TABLE_SCHEMA = 'rvfc') BEGIN
CREATE TABLE [rvfc].[control_forecastscenario](
    [Scenario] [varchar](255) NULL,
    [Active] [varchar](255) NULL
    )

Сообщение 102, уровень 15, состояние 1, строка 8 Неправильный синтаксис рядом с ')'.

Сообщение такое же, потому что блок BEGIN требует закрытия с помощью END, что делает весь блок BEGIN недействительным. Итак, ) был последним допустимым символом в сценарии, так что это последнее место, где SQL может сообщить об ошибке.


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

17.04.2021
Новые материалы

Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

Объяснение документов 02: BERT
BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


Для любых предложений по сайту: [email protected]