2016-09-15 60 views
1
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到表中。我试图将数据保存到临时表中,删除原始表然后重新创建它。SQL脚本无效列名

当我运行该脚本,我得到一个错误:

Invalid column name 'ID'

我猜它是做一个预编译和让我知道ID并不在当前的表中。

我需要做些什么来修改这个脚本,使其运行?

当我双击Invalid column name 'ID'消息时,它给我带来的这部分脚本:

INSERT INTO 
    dbo.tblRCatOmit(ID, 
      RCatID, 
      CountryID) 
+1

为什么你将身份插入,然后不提供一个值?我会为你的专栏推荐一个比ID更好的名字。也许像RCatOmitID。我也建议在你的桌子上取消tbl优先。除了增加额外的按键操作,它们什么也不做,并且让你很难看到你所引用的表格。 –

+0

@SeanLange - 同意!处理遗留代码。 – webdad3

回答

2
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,如果你这样做,并且在你插入到你最近重新创建的表上,它会为你创建它。也意味着不需要设置身份插入。

如果你不想使用临时表并添加插入你也可以使用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)