如何使用MS SQL 2008获取数据库中的表列表?

Tib*_*ibi 30 sql select sql-server-2008

我想验证一个表是否存在于数据库中,如果它不存在,则创建它.如何获取当前数据库中所有表的列表?

我可以用这样的SELECT获取数据库列表:

SELECT * FROM sys.databases
Run Code Online (Sandbox Code Playgroud)

剩下的就是创建表,如果它不存在.

我也尝试用这样的数据库同时创建表:

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
Run Code Online (Sandbox Code Playgroud)

但它在'使用'行上给我错误,说'db'不存在.这一次,我将尝试在两个不同的命令中执行此操作.

Bra*_*one 59

这应该为您提供数据库中所有表的列表

SELECT Distinct TABLE_NAME FROM information_schema.TABLES
Run Code Online (Sandbox Code Playgroud)

所以你可以使用它类似于你的数据库检查.

If NOT EXISTS(SELECT Distinct TABLE_NAME FROM information_schema.TABLES Where TABLE_NAME = 'Your_Table')
BEGIN
    --CREATE TABLE Your_Table
END
GO
Run Code Online (Sandbox Code Playgroud)


Joh*_*ock 17

此查询将获取数据库中的所有表

USE [DatabaseName];

SELECT * FROM information_schema.tables;
Run Code Online (Sandbox Code Playgroud)


Tom*_*m H 5

回答标题中的问题,您可以查询sys.tablessys.objects在何处type = 'U'检查是否存在表格.您还可以使用OBJECT_ID('table_name','U').如果它返回非null值,则表存在:

IF (OBJECT_ID('dbo.My_Table', 'U') IS NULL)
BEGIN
    CREATE TABLE dbo.My_Table (...)
END
Run Code Online (Sandbox Code Playgroud)

对于具有DB_ID()的数据库,您可以执行相同的操作:

IF (DB_ID('My_Database') IS NULL)
BEGIN
    CREATE DATABASE My_Database
END
Run Code Online (Sandbox Code Playgroud)

如果要创建数据库然后开始使用它,则需要在单独的批处理中完成.我不知道你的案件的细节,但不应该有很多情况下这是不可能的.在SQL脚本中,您可以使用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
Run Code Online (Sandbox Code Playgroud)

编辑:正如其他人所建议的那样,INFORMATION_SCHEMA.TABLES系统视图可能更可取,因为它可能是一个标准,可能是RDBMS之间的标准.