2014-01-16 166 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将失败,因此需要解决这些问题。

相关问题