SQL Server错误:'MODIFY'附近的语法不正确。在我的查询中

时间:2014-01-16 20:55:05

标签: sql-server tsql

这是我尝试执行的查询

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
  'MODIFY'附近的语法不正确。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

添加新列:

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

需要注意的一点是,更改现有列以及在Identity中也是如此。

修改1:评论ALTER语法,以正确突出marc_s指出的问题

相关解决方案可在this answer找到。

答案 1 :(得分: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将失败,因此需要解决这些问题。