2014-01-16 167 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 ....' - 但SQL Server中沒有'MODIFY'關鍵字,也不能將'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 

有一點要注意的是,改變現有列和太身份是相當棘手的。

編輯1:評論的ALTER語法正確的突出問題,通過marc_s

相關的解決方案指出,可以在this answer找到。

+1

你的第一個代碼示例中的ADD COLUMN應該是'ADD',因爲MSSQL是偷偷摸摸的。 – Avarkx

+0

@Avarkx是的,你說得對,謝謝指出! – Abhinav

+2

你**不能**改變一個現有的列添加「IDENTITY」 - 不起作用。你需要添加一個**新**列,如果你想它是'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工作,你可能需要修改你居然可以嘗試它同步之前的事情。如果結構不相同(即:原始RecordID列可爲空),則SWITCH將失敗,因此需要解決這些問題。

相關問題