Я хотел бы, чтобы это было окончательным обсуждением того, как проверить, существует ли таблица в SQL Server 2000/2005 с использованием операторов SQL.
Когда вы Google для ответа, вы получите так много разных ответов. Есть ли официальный / обратный и прямой совместимый способ сделать это?
Вот два возможных способа сделать это. Какой из двух является стандартным / лучшим способом сделать это?
Первый способ:
IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME='mytablename')
SELECT 1 AS res ELSE SELECT 0 AS res;
Второй способ:
IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
SELECT 1 AS res ELSE SELECT 0 AS res;
MySQL обеспечивает простой
SHOW TABLES LIKE '%tablename%';
заявление. Я ищу что-то подобное.
Ответы:
Для таких запросов всегда лучше использовать
INFORMATION_SCHEMA
представление. Эти представления (в основном) являются стандартными для многих различных баз данных и редко меняются от версии к версии.Чтобы проверить, существует ли таблица, используйте:
источник
SELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Также обратите внимание, что если по какой-либо причине вам нужно проверить временную таблицу, вы можете сделать это:
источник
Мы всегда используем
OBJECT_ID
стиль, насколько я помнюисточник
OBJECT_ID('TableName', 'U')
чтобы гарантировать, что объект является таблицей.IF EXISTS
запроса из принятого ответа снова и снова. Кроме того, все загадочно, пока вы не прочитаете документацию, особенно в T-SQL (или любом другом варианте, на самом деле).Пожалуйста, смотрите ниже подходы,
Подход 1: Использование представления INFORMATION_SCHEMA.TABLES
Мы можем написать запрос, как показано ниже, чтобы проверить, существует ли таблица клиентов в текущей базе данных.
Подход 2: Использование функции OBJECT_ID ()
Мы можем использовать функцию OBJECT_ID (), как показано ниже, чтобы проверить, существует ли таблица клиентов в текущей базе данных.
Подход 3. Использование каталога sys.Objects
Мы можем использовать представление каталога Sys.Objects, чтобы проверить существование таблицы, как показано ниже:
Подход 4. Использование каталога sys.Tables
Мы можем использовать представление каталога Sys.Tables, чтобы проверить существование таблицы, как показано ниже:
Подход 5. Избегайте использования системной таблицы sys.sysobjects.
Мы должны избегать использования системной таблицы sys.sysobjects напрямую, прямой доступ к ней не рекомендуется в некоторых будущих версиях Sql Server. Что касается ссылки Microsoft BOL, Microsoft предлагает использовать каталоги sys.objects / sys.tables вместо системной таблицы sys.sysobjects напрямую.
по ссылке : http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
источник
Ищете таблицу в другой базе данных:
источник
Просто хотел бы упомянуть одну ситуацию, когда было бы немного проще использовать
OBJECT_ID
метод. ПредставленияINFORMATION_SCHEMA
- это объекты в каждой базе данных.https://msdn.microsoft.com/en-us/library/ms186778.aspx
Поэтому все таблицы, к которым вы обращаетесь с помощью
будет отражать только то, что в
[database]
. Если вы хотите проверить, существуют ли таблицы в другой базе данных, без динамического изменения[database]
каждый раз,OBJECT_ID
это позволит вам сделать это «из коробки». бывшийработает так же хорошо, как
SQL SERVER 2016 Редактировать :
Начиная с 2016 года Microsoft упростила возможность проверять несуществующие объекты перед удалением, добавляя
if exists
ключевые слова вdrop
операторы. Например,будет делать то же самое, что и
OBJECT_ID
/INFORMATION_SCHEMA
wrappers, в 1 строке кода.https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
источник
источник
Использование информационной схемы - это стандартный способ SQL, поэтому она должна использоваться всеми базами данных, которые ее поддерживают.
источник
Здесь в приведенном выше коде имя таблицы
Mapping_APCToFANavigator
.источник
{ }
) на панели инструментов редактора , чтобы красиво формат и синтаксис выделить его!Если вам нужно работать с разными базами данных:
источник
Я знаю, что это старый вопрос, но я нашел такую возможность, если вы планируете часто его называть.
источник
sysname
тип данныхvarchar(50)
. Не следует использовать устаревшееsysobjects
представление и не принимает во внимание схему.Вы можете использовать ниже код
Или
источник
Просто добавив сюда, в интересах разработчиков и коллег-администраторов баз данных
скрипт, который получает @Tablename в качестве параметра
(которая может содержать или не содержать имя схемы) и возвращает информацию ниже, если существует схема:
Я создал этот сценарий для использования внутри других сценариев каждый раз, когда мне нужно проверить, существует ли таблица или представление, и когда это произойдет, получить его object_id для использования в других целях.
Возникает ошибка, когда вы передали пустую строку, неверное имя схемы или неверное имя таблицы.
это может быть внутри процедуры и возвращать -1, например.
Например, у меня есть таблица с именем «Facts.FactBackOrder» в одной из моих баз данных хранилища данных.
Вот как я этого добился:
источник
dbo.[hello.world ]
и скрипт не смог бы найти ее по нескольким причинам. Тем не менее, вряд ли кто-то захочет создать такую таблицу, но все же. В любом случае, вашTHE_NAME
столбец определен какsysname', yet you try to squeeze 2
столбцы sysname` и точка (.
), все они заключены в квадратные скобки ... что однажды обязательно произойдет сбой!В SQL Server 2000 вы можете попробовать:
источник
источник
Что-то, что важно знать всем, кто еще не нашел своего решения: SQL-сервер! = MYSQL . Если вы хотите сделать это с MYSQL , это довольно просто
Размещать это здесь, потому что это самый популярный сайт в Google.
источник
источник
Вы можете использовать это:
источник
источник
- создать процедуру, чтобы проверить, существует ли таблица
- - как использовать: проверить, существует ли миграция таблиц
источник
источник
Я взял здесь создание представления в качестве примера .
Потому что команды ALTER / CREATE не могут быть внутри блоков BEGIN / END. Вам нужно проверить существование и отбросить его перед созданием
Если вас беспокоит потеря разрешений, вы можете также написать сценарий для операторов GRANT и запустить их в конце.
Вы можете обернуть create / alter в строку и выполнить EXEC - это может быть уродливо для больших представлений
источник
Если кто-то пытается сделать то же самое в linq to sql (или особенно linqpad), включите опцию, чтобы включить системные таблицы и представления, и сделайте этот код:
учитывая, что у вас есть объект с именем в свойстве с именем item, а схема в свойстве с именем schema, где имя исходной переменной
a
источник
Если это будет «окончательное» обсуждение, то следует отметить, что сценарий Ларри Леонарда может также запрашивать удаленный сервер, если серверы связаны между собой.
источник
У меня были некоторые проблемы с выбором из INFORMATIONAL_SCHEME и OBJECT_ID. Я не знаю, проблема ли это в драйвере ODBC или что-то в этом роде. Запросы из студии управления SQL оба были в порядке.
Вот решение:
Таким образом, если запрос не выполняется, вероятно, в базе данных нет такой таблицы (или у вас нет прав доступа к ней).
Проверка выполняется путем сравнения значения (целое число в моем случае), возвращаемого исполнителем SQL, который работает с драйвером ODBC.
источник
Есть еще один вариант, чтобы проверить, существует ли таблица в разных базах данных.
источник
Запустите этот запрос, чтобы проверить, существует ли таблица в базе данных:
источник
Учтите, в одной базе данных у вас есть таблица t1. Вы хотите запустить скрипт на другой базе данных, как - если существует t1, то больше ничего не создайте t1. Для этого откройте Visual Studio и выполните следующие действия:
Щелкните правой кнопкой мыши на t1, затем выберите Script table as, затем DROP и Create To, затем New Query Editor.
Вы найдете нужный вам запрос. Но перед выполнением этого скрипта не забудьте закомментировать оператор drop в запросе, поскольку вы не хотите создавать новый, если он уже есть.
Спасибо
источник