如果不存在列,则创建表

时间:2013-09-18 13:27:53

标签: sql sql-server sql-server-2012

是否可以在没有列的情况下在MSSQL中创建表?

我问这个是因为我必须检查每个列是否已经存在。

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Tags]') AND type in (N'U'))
    BEGIN
        CREATE TABLE [dbo].Tags(
        [Id] [int] IDENTITY(1,1) NOT NULL,
         CONSTRAINT [PK_Tags] PRIMARY KEY CLUSTERED 
        (
            [Id] ASC
        )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
        ) ON [PRIMARY]
    END
GO

如果表和列已经存在,则执行可能会因创建列Id而中断。

这将是理想的:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Tags]') AND type in (N'U'))
CREATE TABLE [dbo].Tags
GO

if NOT EXISTS (select column_name from INFORMATION_SCHEMA.columns where table_name = 'Tags' and column_name = 'Id')
  alter table MyTable add MyColumn int IDENTITY(1,1) NOT NULL
GO

-- add new primary key constraint on new column   
ALTER TABLE dbo.Tags 
ADD CONSTRAINT PK_Tags
PRIMARY KEY CLUSTERED ([Id] ASC)
GO

我找不到第二段代码的例子。但我可以想象一个表不能用0列创建。

有什么建议吗?

[编辑] 更多背景。有些表存在,有些表没有。有些列存在,有些则没有。我想创建一个脚本,可以随时执行而不会破坏或导致错误消息,就像表/列已经存在一样。

3 个答案:

答案 0 :(得分:1)

此代码

create table tab

引发错误

  

'tab'附近的语法不正确。

和此代码

 create table tab1
 (
   id int
 )

 alter table tab1 drop id

引发错误

  

ALTER TABLE'tab1'失败。删除表中的所有列不是   允许的。

所以没有列的表是不可能的。

答案 1 :(得分:0)

当然你不能在SQL Server中创建没有列的表,但是如果在创建表之前它不存在,那么它没有任何列,那你为什么不简单地创建它?

如果这是一种升级脚本,您可以执行ELSE分支,在添加它之前检查每个列。

答案 2 :(得分:0)

我认为您可以使用以下内容实现您正在尝试的内容:

使用ID创建表,并且只检查是否存在Id列,如果您不必创建表。

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Tags]') AND type in (N'U'))
BEGIN 
    CREATE TABLE [dbo].Tags (Id int IDENTITY(1,1) NOT NULL)
END
ELSE
BEGIN
    if NOT EXISTS (select column_name from INFORMATION_SCHEMA.columns where table_name = 'Tags' and column_name = 'Id')
    BEGIN
        alter table [dbo].Tags add MyColumn int IDENTITY(1,1) NOT NULL

        -- add new primary key constraint on new column   
        ALTER TABLE dbo.Tags 
        ADD CONSTRAINT PK_Tags
        PRIMARY KEY CLUSTERED ([Id] ASC)
    END
ELSE

GO