Портативный SQL, чтобы определить, существует ли таблица или нет? - PullRequest
5 голосов
/ 04 августа 2009

Существует ли портативный способ определения, существует ли таблица базы данных или нет?

Ответы [ 7 ]

4 голосов
/ 04 августа 2009

портативный? Я так не думаю.

Возможно, самое близкое, что вы можете получить:

select * from <table>

И это вернет ошибку, если таблица не существует.

4 голосов
/ 04 августа 2009

К сожалению, это настолько переносимо, насколько это возможно:

select
    count(*)
from
    information_schema.tables
where
    table_name = 'tablename'
    and table_schema = 'dbo'

Это определенно работает на SQL Server, MySQL и Postgres. Не так много на Oracle, хотя. Для этого вам нужно получить доступ к словарю данных Oracle. Однако существует проект с открытым исходным кодом, который создает information_schema в Oracle из словаря данных. Вы можете попробовать это, если вам нужна абсолютная мобильность.

P.S.-Schema не обязательно должна быть dbo, но это наиболее распространенная.

2 голосов
/ 12 июля 2012

Я бы сказал

select 'x' from <table_name> where 0=1;

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

1 голос
/ 04 февраля 2012

Вот что-то достаточно переносимое:

выберите сейчас () из предела ТАБЛИЦЫ 1;

Это не зависит от знания какого-либо конкретного столбца.

Это не связано с накладными расходами, которые иногда имеет счет (*).

Неважно, таблица пуста или нет.

Сбой, если таблица не существует.

1 голос
/ 04 августа 2009

Представления INFORMATION_SCHEMA соответствуют стандарту ANSI, поэтому они должны быть наиболее переносимым вариантом Не забудьте добавить схему и тип таблицы в предложение where ...

if exists(select  *
          from    information_schema.tables
          where   table_schema = 'dbo'
                  and table_name = 'MyTable'
                  and table_type = 'basetable')
begin
     -- your code here
end
0 голосов
/ 04 августа 2009

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

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

select top 1 *
from MyTable

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

0 голосов
/ 04 августа 2009

Поскольку у каждой СУБД есть своя собственная метабаза, я думаю, что самый «переносимый» способ сделать это - использовать сам вызывающий приложение. Что-то вроде

try
    execute("select top 1 * from table")
    return (true)
catch
    return false
...