2016-09-15 9 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 

Ich muss ein neues IDENTITY-Feld sowie PKs und FKs zu einer Tabelle hinzufügen. Ich versuche, die Daten in einer temporären Tabelle zu speichern, die ursprüngliche Tabelle zu löschen und dann neu zu erstellen.SQL Script Ungültiger Spaltenname

Wenn ich dieses Skript ausführen bekomme ich einen Fehler:

Invalid column name 'ID'

Ich vermute, es eine Pre-Kompilierung tut und ließ mich wissen, dass ID nicht in der aktuellen Tabelle nicht vorhanden ist.

Was muss ich tun, um dieses Skript so zu ändern, dass es ausgeführt wird?

Wenn ich auf die doppelte Invalid column name 'ID' Nachricht es mich an das Skript zu diesem Teil bringt:

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

Warum drehen Sie die Identität ein und geben dann keinen Wert an? Ich würde einen besseren Namen als ID für Ihre Spalte empfehlen. Vielleicht etwas wie RCatOmitID. Ich würde auch vorschlagen, die Tabellenvorwahl auf Ihren Tischen zu entfernen. Sie tun nichts, außer zusätzliche Tastenanschläge hinzuzufügen und es schwieriger zu machen, zu sehen, auf welche Tabelle Sie verweisen. –

+0

@SeanLange - Einverstanden! Umgang mit Legacy-Code. – webdad3

Antwort

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 
  • Wenn Sie jede Menge Daten haben alle verwenden eine temporäre Tabelle nicht eine Tabellenvariable , weil Leistung wird viel besser sein!
  • Als nächstes nicht die ID auf der Temp-Tabelle erstellen, ist es willkürlich, wenn Sie das tun und auf Ihrem Einfügen zurück zu Ihrer neu erstellten Tabelle wird es dort für Sie bauen. Dies bedeutet auch, dass keine Identität eingefügt werden muss.

Wenn Sie nicht über eine temporäre Tabelle verwenden möchten, und fügen hinzu, dass fügen Sie auch sp_rename verwenden könnte Ihre vorhandene Tabelle umbenennen ....

Und wenn Sie kümmern sich nicht um Ordnungsposition Die Spalten fügen dann einfach die Spalte und dann die Schlüssel hinzu.

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) 
Verwandte Themen