Как получить таблицу в базе данных, используя MS SQL 2008?
Я хочу проверить, существует ли таблица в базе данных, и если она не существует, чтобы создать ее.
Как я могу получить список всех таблиц в текущей базе данных?
Я мог бы получить список базы данных с помощью SELECT следующим образом:
SELECT * FROM sys.databases
Осталось создать таблицу, если она не существует.
Я также попытался создать таблицы одновременно с базой данных следующим образом:
if not exists(select * from sys.databases where name = 'db')
begin
create database [db]
use [db];
create table [test] (
Time datetime,
Message varchar(1024) )
end
Но это дает мне ошибку в строке "use", говоря, что "db" не существует. На этот раз я попытаюсь сделать это в двух разных командах.
Ответы
Ответ 1
Это даст вам список всех таблиц в вашей базе данных
SELECT Distinct TABLE_NAME FROM information_schema.TABLES
Таким образом, вы можете использовать его аналогично проверке базы данных.
If NOT EXISTS(SELECT Distinct TABLE_NAME FROM information_schema.TABLES Where TABLE_NAME = 'Your_Table')
BEGIN
--CREATE TABLE Your_Table
END
GO
Ответ 2
Этот запрос доставит вам все таблицы в базе данных
USE [DatabaseName];
SELECT * FROM information_schema.tables;
Ответ 3
Отвечая на вопрос в заголовке, вы можете запросить sys.tables
или sys.objects
, где type = 'U'
, чтобы проверить наличие таблицы. Вы также можете использовать OBJECT_ID ('table_name', 'U'). Если он возвращает ненулевое значение, то таблица существует:
IF (OBJECT_ID('dbo.My_Table', 'U') IS NULL)
BEGIN
CREATE TABLE dbo.My_Table (...)
END
Вы можете сделать то же самое для баз данных с DB_ID():
IF (DB_ID('My_Database') IS NULL)
BEGIN
CREATE DATABASE My_Database
END
Если вы хотите создать базу данных и затем начать ее использовать, это необходимо сделать отдельными партиями. Я не знаю специфики вашего дела, но не должно быть много случаев, когда это невозможно. В SQL script вы можете использовать инструкции GO
. В приложении достаточно легко отправить новую команду после создания базы данных.
Единственное место, где может возникнуть проблема, - это попытаться сделать это в хранимой процедуре и создавать базы данных "на лету", как правило, это плохая идея.
Если вам действительно нужно сделать это в одной партии, вы можете обойти проблему, используя EXEC, чтобы обойти ошибку синтаксического анализа не существующей базы данных:
CREATE DATABASE Test_DB2
IF (OBJECT_ID('Test_DB2.dbo.My_Table', 'U') IS NULL)
BEGIN
EXEC('CREATE TABLE Test_DB2.dbo.My_Table (my_id INT)')
END
РЕДАКТИРОВАТЬ: Как предполагали другие, системный вид INFORMATION_SCHEMA.TABLES
, вероятно, предпочтительнее, поскольку он предположительно является стандартом, идущим вперед и, возможно, между РСУБД.