Sas проверка существования таблицы
Я хотел бы, чтобы это было окончательным обсуждением того, как проверить, существует ли таблица в SQL Server 2000/2005 с использованием операторов SQL.
Вот два возможных способа сделать это. Какой из двух является стандартным / лучшим способом сделать это?
MySQL обеспечивает простой
заявление. Я ищу что-то подобное.
Почему лучше использовать INFORMATION_SCHEMA.TABLES вместо sys.tables, а затем отфильтровать по имени, может быть, добавить проверку значения type_desc?Для таких запросов всегда лучше использовать INFORMATION_SCHEMA представление. Эти представления (в основном) являются стандартными для многих различных баз данных и редко меняются от версии к версии.
Чтобы проверить, существует ли таблица, используйте:
Работает отлично! В T-SQL (в ответ на оригинальный постер) это TABLE_SCHEMA, а не SCHEMA_NAME. Спасибо за совет. Учитывая, что одно только имя объекта (то есть без схемы) не гарантируется быть уникальным, не существует 100% надежного способа сделать это. Если вы работаете с БД, которая не имеет конфликтов имен в разных схемах, то просто пропустите TABLE_SCHEMA = 'TheSchema' "будет работать очень хорошо. @akmad Компилятор SQL-запросов проверит таблицу перед запуском запроса и завершится ошибкой даже перед запуском.Также обратите внимание, что если по какой-либо причине вам нужно проверить временную таблицу, вы можете сделать это:
Использование этого метода, похоже, учитывает природу подключения временных таблиц. Ранее опубликованный запрос INFORMATION_SCHEMA будет возвращать строки независимо от соединения, создавшего таблицу.Мы всегда используем OBJECT_ID стиль, насколько я помню
Я считаю, что это будет быстро, хотя и не очень портативно. Представления информационной схемы гарантированно существуют в любой СУБД, поддерживающей стандарт. Кроме того, обычный OBJECT_ID не гарантирует, что объект является таблицей. Спасибо, Джо, мне было интересно, почему вы используете OBJECT_ID против INFORMATION_SCHEMA.TABLES против sys.tables. Указание на то, что INFORMATION_SCHEMA является частью стандарта, в значительной степени отвечает на этот вопрос. Кстати, забавно, что один из наших экспертов по базам данных, который я собирался задать этому вопросу, имеет ту же фамилию, что и вы, должна быть хорошей фамилией для баз данных. @JoePineda: Тогда вы используете случай, OBJECT_ID('TableName', 'U') чтобы гарантировать, что объект является таблицей. @AllonGuralnek, так что, вместо того, чтобы следовать простому и переносимому стандарту, добавить дополнительную загадочную информацию? @DustinFineout: вопрос был помечен как tsql , поэтому переносимость не так важна . В общем, я сталкивался с очень немногими действительно переносимыми кодовыми базами, и если краткость оценивается, то она наверняка превосходит написание этого IF EXISTS запроса из принятого ответа снова и снова. Кроме того, все загадочно, пока вы не прочитаете документацию, особенно в T-SQL (или любом другом варианте, на самом деле).Пожалуйста, смотрите ниже подходы,
Подход 1: Использование представления INFORMATION_SCHEMA.TABLES
Мы можем написать запрос, как показано ниже, чтобы проверить, существует ли таблица клиентов в текущей базе данных.
Подход 2: Использование функции OBJECT_ID ()
Мы можем использовать функцию OBJECT_ID (), как показано ниже, чтобы проверить, существует ли таблица клиентов в текущей базе данных.
если нет такого варианта то я воспользуюсь вещами с формов, зарание спасибо!
Зачем же делать выборку, когда список таблиц доступен.
В PHP это проверить можно так:
И далее уже обрабатываете результаты.
Это вы какие-то неправильные форумы смотрите.
Делайте выборку из information_schema или
не могу к стати найти документацию по SHOW TABLES FROM тутПросто нужно проверить, чтобы следующий запрос вернул одну строку
Выборка из таблицы может приводить к ошибочному срабатыванию, если таблица пустая.
Мой выбор — SHOW TABLES при обязательном использовании подготовки (prepare) запросов во избежание sql-инъекций, если исходное имя таблицы хранится в переменной. Псевдокод, возможны опечатки — не протестировал, лишь пишу логику.
То, что обычно подобные запросы занимают много строк, на мой взгляд, связано как раз-таки с проблемами, вызванными возможными sql-инъекциями. Если Вы не знаете что это такое, просто набейте в Google.
На мой взгляд самый лучший метод таков
простой селект, а LIMIT - позволит не грузить сильно сервер, если кто найдет лучше и самое главное проще то думаю тут и ответят, а пока буду и дальше тогда юзать такую конструкцию пока не найдется альтернатива
19.1k 28 28 золотых знаков 40 40 серебряных знаков 133 133 бронзовых знакасуществуют ли какие-либо операторыфункции, способные получить имя переменных? Предпочтительно поместить их в столбец другого набора данных, текстовое поле или переменную макроса.
Э. Г.
- набор данных 1
ожидаемый набор данных
Var_name_of_dataset1
PS: Я знаю заявление: выберите в, который делает sth релевантно Оно может прочитайте значение столбца в поле с настраиваемыми разделителями и, следовательно, пожелайте, чтобы были аналогичные способы чтения имен столбцов в поле или столбец.
содержимое PROC будет самым быстрым способом получить эту информацию в наборе данных. Имена столбцов можно найти в названии столбца.
вы также можете использовать функции datastep и array, например
это создает переменную макроса с именем & vlist, которая будет содержать имена всех переменных в вашем наборе данных, разделенные пробелом. Если вы хотите запятые между именами переменных, все, что вам нужно сделать, это изменить значение "разделено" от ""до",". Использование функции upcase в инструкции where позволяет избежать проблем с передачей имени набора данных в неправильном случае. Глобальный оператор необходим, так как созданная переменная макроса не обязательно будет доступна вне макроса без определения его как глобального
немного изменено из справки SAS и документации.
тогда мы сохраняем регистр и порядок данных, даже если числовой и символьный смешаны.
Я не уверен, что утверждение Rawfocus о том, что чтение таблиц словаря запрашивает все библиотеки, верно, если бы в Примере использовался sashelp.vcolumn вместо этого было бы верно, что подход очень медленный и имеет доступ ко всем выделенным библиотекам. (Вы можете доказать это с помощью опции системы SAS RTRACE.)
Я считаю, что SQL-запрос к словарю.columns-самый быстрый из описанных здесь методов. Очевидно, что макротизированный код будет работать без макроса, но точка макрос здесь я думаю как утилита; поместите код в свою любимую библиотеку макросов, и вам никогда не нужно думать об этом снова.
как проверяете существование таблицы?
а проанализировать, есть ли таблица, можно так (ADO+ VC):try
m_pRstEvent->Open("TableName",
_variant_t((IDispatch*)m_pConn),adOpenKeyset, adLockOptimistic,adCmdTable);
>
catch(. )
AfxMessageBox("Такой таблицы нет");
return false;
>
return true;
ну а проверить на то, пустая она или нет, я думаю ты знаешь 2PIL, я VC плохо понимаю. можно ли проверить существование таблицы с помощью SQL? 2 tomsksmile, я таких способов не знаю..
Добавлено 03.12.04, 09:27
Если временную таблицу создавать в той же базе, то за несколько расчетов (от 10 до 15) база распухает примерно в 2 раза
Создавать временные таблицы в базе tmp.mdb и не удалять ее а удалять таблицы в ней ну и иногда делать сжатие.
2Bas, где можно посмотреть значения msysobjects.type?
мне нужно значение для представлений view.
нашел, что запросы и преддставления - это msysobjects.type=5
Описание системной таблицы MS Access - MSysObjects
поторопился. из MS Access я могу "читать msysobjects"
пытаюсь писать в Дельфи6
что делать?
ADO/Delphi6/Access97
Кажеться так
1 – определяет таблицу
2 – поле
3 - индекс
В королевстве предлагают пользоваться стронними компанентами. опять какие-то дебри.
мне нужно работая с представлениями перед их использованием удалять их (проверив что они есть) а потом заполнять и снова удалять. удаление перед использованием необходимо для того, чтобы если во время заполения представлений произошел сбой, то нужно избежать проблемы в следующий раз.
Пусть предлагают.
Когда содавал DNS там была галочка Системная База Данных - и стояло нет.
Установи в другое положение и укажи путь к системной базе по умолчанию это system.mdw . И теперь конектишся с User Name - Admin и будут у тебя права.
нужно поменять Jet OLEDB:Create System Database=False на True?
в Jet OLEDB:System database писать путь или просто system.mdw.
что еще можно сделать?
из всех свойств оставил только три
кроме того переписал
- кавычки добавил.
и все сработало.
сначала сделал, а потом подумал. а нужно было наоборот.
полез смотреть реестр.
программу запускал под Администратором - она сработала,
запустил под пользоватлем - она пошла, только после изменения пути
по сему два вопроса:
1. За что отвечает свойство Jet OLEDB:Create System Database?
2. как сделать так, чтобы можно было работать с программой под любым пользователем?
мои идеи:
1. свойство Jet OLEDB:Create System Database, установленное в True, говорит Jet, что мы создаем «пустую» системную базу, а не собираемся использовать существующую.
2. читать реестр
Читайте также: