繁体   English   中英

SQL脚本无效的列名

[英]SQL Script Invalid Column name

BEGIN TRANSACTION
BEGIN TRY
DECLARE @tblRCatOmitTemp TABLE (ID INT IDENTITY(1,1),
RCatId          int     NOT NULL,
CountryId   int     NOT NULL)

INSERT INTO @tblRCatOmitTemp
    SELECT  RCatId, CountryId 
    FROM    dbo.tblRCatOmit TABLOCKX

DROP TABLE dbo.tblRCatOmit

CREATE TABLE dbo.tblRCatOmit(   
            ID     INT IDENTITY(1,1),
        RCatId     INT NOT NULL,
        CountryId  INT NOT NULL) ON [PRIMARY]

ALTER TABLE dbo.tblRCatOmit  
ADD CONSTRAINT PK_RCatOmit PRIMARY KEY CLUSTERED (ID);  

ALTER TABLE dbo.tblRCatOmit   
ADD CONSTRAINT FK_RCatOmit_rcatId FOREIGN KEY (RCatId)     
    REFERENCES dbo.tblRCat (RCatID);   

ALTER TABLE dbo.tblRCatOmit    
ADD CONSTRAINT FK_RCatOmit_countryId FOREIGN KEY (CountryId)     
    REFERENCES dbo.tblCountry (CountryID)        

SET IDENTITY_INSERT dbo.tblRCatOmit ON
INSERT INTO 
    dbo.tblRCatOmit(
        ID,
        RCatID,
        CountryID)
SELECT
    ID,
    RCatID,
    CountryID
FROM 
    @tblRCatOmitTemp
SET IDENTITY_INSERT dbo.tblRCatOmit OFF

COMMIT TRANSACTION tblRCatOmit;
END TRY
BEGIN CATCH
    PRINT N'Something Happend!'
    ROLLBACK;
END CATCH

我必须向表中添加一个新的IDENTITY字段以及PK和FK。 我试图将数据保存到临时表中,删除原始表,然后重新创建它。

当我运行此脚本时,出现错误:

无效的列名“ ID”

我猜它正在进行预编译,并让我知道ID在当前表中不存在。

我需要做什么来修改此脚本才能运行?

当我双击Invalid column name 'ID'消息时,它将带我进入脚本的这一部分:

INSERT INTO 
    dbo.tblRCatOmit(ID,
            RCatID,
            CountryID)
BEGIN TRANSACTION
BEGIN TRY

IF OBJECT_ID('tempdb..#tblRCatOmitTemp') IS NOT NULL
    BEGIN
        DROP TABLE #tblRCatOmitTemp
    END

CREATE TABLE #tblRCatOmitTemp (
    RCatId int NOT NULL,
    CountryId int NOT NULL)

INSERT INTO #tblRCatOmitTemp
    SELECT  RCatId, CountryId 
    FROM    dbo.tblRCatOmit TABLOCKX

DROP TABLE dbo.tblRCatOmit

CREATE TABLE dbo.tblRCatOmit(   
            ID     INT IDENTITY(1,1),
        RCatId     INT NOT NULL,
        CountryId  INT NOT NULL) ON [PRIMARY]

ALTER TABLE dbo.tblRCatOmit  
ADD CONSTRAINT PK_RCatOmit PRIMARY KEY CLUSTERED (ID);  

ALTER TABLE dbo.tblRCatOmit   
ADD CONSTRAINT FK_RCatOmit_rcatId FOREIGN KEY (RCatId)     
    REFERENCES dbo.tblRCat (RCatID);   

ALTER TABLE dbo.tblRCatOmit    
ADD CONSTRAINT FK_RCatOmit_countryId FOREIGN KEY (CountryId)     
    REFERENCES dbo.tblCountry (CountryID)        

INSERT INTO 
    dbo.tblRCatOmit(
        RCatID,
        CountryID)
SELECT
    RCatID,
    CountryID
FROM 
    #tblRCatOmitTemp

COMMIT TRANSACTION tblRCatOmit;
END TRY
BEGIN CATCH
    PRINT N'Something Happend!'
    ROLLBACK;
END CATCH
  • 如果根本没有任何数据,请使用临时表而不是表变量,因为性能会好很多!
  • 接下来,不要在临时表上构建ID,如果这样做,它是任意的,并且在插入回到新创建的表后,它将为您构建ID。 也意味着无需设置身份插入。

如果您不想使用临时表并添加该插入,也可以使用sp_rename重命名现有表。

而且,如果您不在乎列的顺序位置,则只需添加列,然后再添加键。

ALTER TABLE dbo.tblRCatOmit
ADD ID INT IDENTITY(1,1)

ALTER TABLE dbo.tblRCatOmit  
ADD CONSTRAINT PK_RCatOmit PRIMARY KEY CLUSTERED (ID);  

ALTER TABLE dbo.tblRCatOmit   
ADD CONSTRAINT FK_RCatOmit_rcatId FOREIGN KEY (RCatId)     
    REFERENCES dbo.tblRCat (RCatID);   

ALTER TABLE dbo.tblRCatOmit    
ADD CONSTRAINT FK_RCatOmit_countryId FOREIGN KEY (CountryId)     
    REFERENCES dbo.tblCountry (CountryID)  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM