2014-01-16 5 views
-2

Это вопрос, который я пытаюсь выполнитьОшибка SQL Server: неправильный синтаксис около 'MODIFY'. в моем запросе

use [warz] 
go 

ALTER TABLE dbo.items_lootdata 
MODIFY TABLE [RecordID] [int] IDENTITY(1,1) NOT NULL 
go 

я получил ошибку:

Msg 102, Level 15, State 1, Line 3
Incorrect syntax near 'MODIFY'.

Любые идеи?

+0

Вы хотите добавить новый столбец или просто изменить существующий столбец? – Abhinav

+1

Команда 'MODIFY' не существует в SQL Server. Чего вы пытаетесь достичь? Добавить новый столбец? Изменить существующий? Добавить личность? –

+0

Вы можете ** (a) ** добавить новый столбец с 'ALTER TABLE ... ADD columnName ....' или ** (b) ** вы можете изменить определение столбца с помощью 'ALTER TABLE ... ALTER COLUMN columnName .... '- но ключевое слово MODIFY в SQL Server отсутствует, и вы не можете добавить спецификацию IDENTITY в существующий столбец. –

ответ

2

Добавить новый столбец:

use [warz] 
go 


ALTER TABLE dbo.items_lootdata 
ADD [RecordID] [int] IDENTITY(1,1) NOT NULL 
go 

Изменить существующий столбец:

use [warz] 
go 

-- remember you cannot alter an existing column to 
-- identity, following is only for syntax 
ALTER TABLE dbo.items_lootdata 
ALTER COLUMN [RecordID] [int] IDENTITY(1,1) NOT NULL 
go 

Одна вещь, чтобы отметить, что изменение существующего столбца и, что тоже в идентичности довольно сложно.

Edit 1: Комментируя синтаксис ALTER правильно выделить вопрос, как указывал marc_s

соответствующие решения могут быть найдены в this answer.

+1

'ADD COLUMN' в вашем первом примере кода должен быть просто' ADD', потому что MSSQL так скрыт. – Avarkx

+0

@Avarkx Да, вы правы, спасибо, что указали это! – Abhinav

+2

Вы ** НЕ МОЖЕТЕ ** изменить существующий столбец, чтобы добавить к нему «ИДЕНТИФИКАЦИЯ» - не работает. Вам нужно добавить ** новый столбец **, если вы хотите, чтобы он был «IDENTITY» –

0

Похоже, что ваш MODIFY TABLE должен быть ALTER COLUMN.

IDENTITY может быть больно, поскольку вам не удастся добавить его как свойство в столбец. Таблицы с колонками IDENTITY должны иметь их (создаваемые таким образом столбцы IDENTITY), и впоследствии нелегко также избавиться от этого свойства.

Предполагая, что у вас есть таблица, которая более или менее так:

IF NOT EXISTS (SELECT 1 
       FROM sys.objects 
       WHERE name = 'items_lootdata' 
        AND type = 'U') 
BEGIN 
    CREATE TABLE dbo.items_lootdata 
    (             
     RecordID INTEGER NOT NULL, 
     MoreData BIT 
    ); 
END; 
GO 

Если вы хотите RecordID быть IDENTITY включен столбец, если таблица пуста, вы можете просто воссоздать объект:

IF NOT EXISTS (SELECT 1 
       FROM sys.objects 
       WHERE name = 'items_lootdata' 
        AND type = 'U') 
BEGIN 
    CREATE TABLE dbo.items_lootdata 
    (             
     RecordID INTEGER IDENTITY(1, 1) NOT NULL, 
     MoreData BIT 
    ); 
END; 
    GO 

Я предпочитаю, если возможно, использовать переключатель метаданных, поскольку он также сохранит любые данные, которые в настоящее время содержатся в вашей таблице. Это включает переименование, создание новой таблицы и самого коммутатора. Вероятно, вы также захотите установить первый параметр своего столбца IDENTITY на то, что больше или равно текущему максимальному значению RecordID, так как я предполагаю, что вам захочется поместить первичный ключ в этот столбец впоследствии.

IF NOT EXISTS (SELECT 1 
       FROM sys.objects 
       WHERE name = 'items_lootdata' 
        AND type = 'U') 
BEGIN 
    --DROP TABLE dbo.items_lootdata; 
    CREATE TABLE dbo.items_lootdata 
    (             
     RecordID INTEGER NOT NULL, 
     MoreData BIT 
    ); 

    INSERT INTO dbo.items_lootdata(RecordID, MoreData) 
    VALUES(1, 1); 
END; 
GO 

EXECUTE dbo.sp_rename @objname = 'dbo.items_lootdata', @newname = 'items_lootdata_old' 

IF NOT EXISTS (SELECT 1 
       FROM sys.objects 
       WHERE name = 'items_lootdata' 
        AND type = 'U') 
BEGIN 
    --DROP TABLE dbo.items_lootdata; 
    CREATE TABLE dbo.items_lootdata 
    (             
     RecordID INTEGER IDENTITY(1, 1) NOT NULL, 
     MoreData BIT 
    ); 
END; 
GO 

ALTER TABLE dbo.items_lootdata_old 
SWITCH TO dbo.items_lootdata; 
GO 

DROP TABLE dbo.items_lootdata_old; 
GO 

INSERT INTO dbo.items_lootdata (MoreData) 
VALUES (0); 
GO 

SELECT * 
FROM dbo.items_lootdata; 

Обратите внимание, что для ALTER ... SWITCH работать, вы, возможно, придется изменить то, что вы на самом деле может синхронизации, прежде чем пытаться его. Ошибка SWITCH, если структуры не идентичны друг другу (то есть: исходный столбец RecordID имеет значение NULL), поэтому эти вещи необходимо будет устранить.

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