【问题标题】:How to get table list in database, using MS SQL 2008?如何使用 MS SQL 2008 获取数据库中的表列表?
【发布时间】:2011-09-29 17:01:22
【问题描述】:

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

我可以使用这样的 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

但它在“使用”行上给了我错误,说“数据库”不存在。这一次,我将尝试在 2 个不同的命令中执行此操作。

【问题讨论】:

    标签: sql sql-server-2008 select


    【解决方案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.tablessys.objects where 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 脚本中,您可以使用 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 系统视图可能更可取,因为它被认为是未来的标准,并且可能在 RDBMS 之间。

        【讨论】:

        • 谢谢,您给出了一个很好的答案,但是,对于 SQL 的初学者来说,这似乎有点太高级了。非常感谢。
        猜你喜欢
        • 2012-10-08
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 2010-09-17
        • 2017-05-22
        • 1970-01-01
        • 2010-10-10
        • 1970-01-01
        相关资源
        最近更新 更多