2013-09-18 3 views
0

Возможно ли создать таблицу в 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 

Выполнение может быть нарушено путем создания идентификатора столбца, если таблица и столбец уже существуют.

Это было бы идеально:

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 столбцами.

Любые предложения?

[Редактировать] Еще один контекст. Некоторые таблицы существуют, а некоторые нет. Некоторые столбцы существуют, а некоторые нет. Я хочу создать скрипт, который может быть выполнен в любое время без нарушения или возникновения ошибки. Msg, как и таблица/столбец, уже существует.

+0

не писать код, создающий таблицы на лету? – StevieG

+0

Вопрос не очень хорошо написан. Должно быть больше деталей. Вы ищете таблицу без столбца или создать столбец таблицы, если столбец уже не существует? – SriniV

+3

Невозможно, к сожалению. Существует ряд мест, где язык SQL не соответствует тому, что вы можете ожидать от действительно установленного языка (т. Е. Пустые множества интересны, но SQL не разрешает таблицы или ключи с пустым набором столбцов) –

ответ

0

Я думаю, что вы можете, что вы получение идеальными вы пытаетесь с помощью следующих действий:

Создать таблицу с идентификатором и проверить только для существования 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 
1

Этот код

create table tab 

вызывает ошибку

возле 'вкладку' Неправильный синтаксис.

и этот код

create table tab1 
(
    id int 
) 

alter table tab1 drop id 

вызывает ошибку

Alter Table 'tab1' Failed. Удаление всех столбцов в таблице не разрешено .

так что стол без колонок невозможен.

0

Конечно, вы не можете создать таблицу без столбцов в SQL Server, но если таблица не существует до ее создания, она не имеет никакого столбца, так почему бы вам просто не создать ее?

Если это своего рода сценарий обновления, вы можете сделать ветку ELSE, где вы проверяете каждый столбец перед его добавлением.

+1

«Конечно» может быть бит сильный. В теории реляций (что SQL должен был пытаться следовать), отношения с без атрибутов по-прежнему интересны. (Как, например, ключи, не содержащие атрибутов, которые подразумевают отношение, которое может содержать только 0 или 1 набор) –

+0

Я знал это, но поскольку этот вопрос был помечен [sql-server], я не хотел путать плакат;) Теперь я добавил «в SQL Server» ... – dnoeth

Смежные вопросы