2016-09-15 85 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)