2015-02-03 2 views
1

Возможно ли объединение таблиц, когда одна или несколько таблиц еще не существуют?Присоединиться к таблице, которая не существует

Рассмотрите этот прецедент: вы используете некоторую систему, которая имеет определенную схему БД из коробки, но также позволяет создавать собственные пользовательские таблицы.

Возможно выполнить запрос какого-либо типа, который включает пользовательские таблицы, но также будет работать без ошибок для тех, у кого нет этих настраиваемых таблиц?

Или что является самым элегантным способом достижения этого без необходимости поддерживать разные версии ваших запросов?

Редактировать: особенно для Sybase ASE, но меня также интересуют другие dbms.

+1

Любые конкретные DBMS вы хотите использовать? (Используйте информацию information_schema.tables, чтобы увидеть, существует ли таблица, и имеют отдельные запросы, если таблица существует или нет.) – jarlh

+0

my dbms будет Sybase ASE –

ответ

2

Вы могли бы сделать что-то вроде этого:

IF EXISTS (Select * from sysobjects where name = 'tblname') 
Begin 

Select * 
from tbl 

End 
Else 
Begin 
--Do something else 
End 

В принципе проверить таблица существует и выполнить запрос, если это произойдет, если это не то сделать что-то еще.

+0

Это фактически вызовет ошибку «Недопустимое имя объекта» или аналогично в большинстве систем. – TZHX

+0

Можете ли вы запустить это на своей машине? Я подозреваю, что нет. Это никогда не ударит 'ELSE', если tbl не существует, он просто выбросит ошибку :) –

+0

О, да, хорошо. Вышеупомянутое должно работать, но только в SQL Server, хотя я уверен, что будут альтернативы, если OP использует другую СУБД –

0

SQL Server

Попробуйте сделать использование TRY/CATCH, она может содержать что-либо до ошибок степени тяжести 20.

В вашем случае вы пытаетесь поймать серьезности ошибки 11 - «Указывает, что данный объект или сущность не существует ». - что должно быть хорошо в блоке TRY/CATCH.

Более подробная информация и примеры здесь: https://msdn.microsoft.com/en-us/library/ms175976.aspx

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

НАЧАТЬ TRY DROP TABLE XXX END TRY НАЧАТЬ CATCH END CATCH

+0

Спасибо, можете ли вы предоставить минимальный пример, пожалуйста? –

1

В большинстве СУБД, выполнение запроса выглядит как-то вроде этого:

  • Parser
    • разрешения имен (это проверяет ссылки объекты, связывает псевдонимы и т. д.)
    • Тип деривации (Определяет конечные типы в наборе результатов)
    • Совокупный bindinf (Определяет, требуется какая-либо агрегация) связывание
    • Group (Связывает агрегацию в список выбора)
  • Algebrizer
  • Optimizer
  • Execution

Из-за шаги выполнения запроса , РСУБД всегда проверяет объекты, на которые ссылаются (во время шага разрешения имен), фактическая обработка запросов (которая выполняет любые пользовательские проверки - например, оператор IF). (Это означает «Манипуляция данными», а не «Определение данных»).

Чтобы сделать это коротко: В большинстве СУРБД вы не можете этого сделать, а только с динамическими запросами.

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

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

Для Sybase, вы можете прочитать больше об обработке запросов в это онлайновая документация: Performance and Tuning Series: Query Processing and Abstract Plans

Смежные вопросы