這是我嘗試執行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'.
任何想法?
這是我嘗試執行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'.
任何想法?
添加新欄:
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找到。
看起來像你的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
將失敗,因此需要解決這些問題。
你想添加一個新的列或只是修改一個現有的列? – Abhinav
'MODIFY'命令在SQL Server中不存在。你想達到什麼目的?添加新列?改變現有?添加身份? –
你可以**(a)**添加一個新列,用ALTER TABLE ... ADD columnName ....或者**(b)**你可以用ALTER TABLE ... ALTER來改變列的定義COLUMN columnName ....' - 但SQL Server中沒有'MODIFY'關鍵字,也不能將'IDENTITY'規範添加到現有列。 –