Почему если бы EXISTS не работал? - PullRequest
2 голосов
/ 17 июня 2009

У меня много кода, который я пытаюсь запустить там, где я запрашиваю таблицу sysobjects, чтобы проверить, существует ли объект, прежде чем я его отброшу и создаю его снова.

Проблема в том, иногда, если я иду:

if not exists (select name from sysobjects o where o.name = 'my_table' and o.type =  'U') 
CREATE TABLE my_table (..)
go

это работает, не беспокойтесь. Однако, когда я вернулся, чтобы запустить его снова, я получил эту прекрасную ошибку:

SQL Server Error on (myserver) Error:2714 at Line:10 Message:There is already an object named 'my_table' in the database.

Спасибо за это, Программист SQL. Я на самом деле просил вас не создавать эту таблицу, если она уже существует. -_-

Есть идеи?

Ответы [ 3 ]

1 голос
/ 17 июня 2009

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

"Я пытаюсь запустить там, где я запрашиваю таблицу sysobjects, чтобы проверить, существует ли объект, прежде чем я его урону и создаю его снова"

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

Непосредственной проблемой, с которой вы столкнулись, является предполагаемое владение БД, которое не соответствовало между запусками.

на основе ваших разъяснений ниже - вот что вы можете сделать:

ЕСЛИ СУЩЕСТВУЕТ (ВЫБЕРИТЕ * ОТ СИСТЕМНЫХ ОБЪЕКТОВ, ГДЕ object_id = OBJECT_ID (N '[dbo]. [XXXX]') И введите (N'U ')) DROP TABLE [dbo]. [XXXX] GO

CREATE TABLE [dbo]. [XXXX (... GO

Вы можете запускать это снова и снова ...

0 голосов
/ 22 июня 2009

да, весь пакет SQL нормализован и скомпилирован так, чтобы создать «план выполнения» для всего пакета. Во время нормализации «возможный» оператор «создать таблицу» является проблемой, если он уже существует во время компиляции.

Мое решение: переименовать -

если существует (выберите 1 из ....) начать Drop Table XYZ создать таблицу xyz_zzzz (...) exec sp_rename 'xyz_zzzz', 'xyz' конец

0 голосов
/ 17 июня 2009

Этап проверки объекта синтаксических анализаторов sybase является глобальным и не основан на условной оценке. Даже если ваш код не может выполнить CREATE TABLE, оператор по-прежнему проверяется на синтаксис и применимость, которые не выполняются, когда система видит, что таблица уже существует.

Единственный известный мне способ обойти это - поместить ваши операторы create в EXEC (), который будет оцениваться только в том случае, если раздел был выполнен.

...