2017-10-12 7 views
1

Il existe plusieurs scripts de migration de données dans mon projet SSDT.Erreur "nom de colonne non valide" lors de l'utilisation de scripts de migration de données

données première stocke d'une table à une autre table temporaire:

IF EXISTS 
(
    SELECT * 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = N'DocumentEvent' 
    AND column_name = N'Thumbprint' 
) 
BEGIN 
    IF NOT EXISTS 
    (
     SELECT * FROM INFORMATION_SCHEMA.TABLES 
     WHERE TABLE_NAME = N'tmp_DocumentEventCertificates' 
    ) 
    BEGIN 
     CREATE TABLE tmp_DocumentEventCertificates 
     (
      [EventId] UNIQUEIDENTIFIER NOT NULL, 
      [Thumbprint] nvarchar(100) 
     ) 
    END 

    INSERT INTO 
     tmp_DocumentEventCertificates 
    SELECT 
     [EventId], 
     [Thumbprint] 
    FROM 
     [DocumentEvent] 
    WHERE 
     [Thumbprint] IS NOT NULL 
END 

données deuxième transferts de table temporaire à une autre table:

IF EXISTS 
(
    SELECT * FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_NAME = N'tmp_DocumentEventCertificates' 
) 
BEGIN 
    UPDATE 
     [DocumentAttachment] 
    SET 
     [DocumentAttachment].[Certificate_Thumbprint] = tmp.[Thumbprint] 
    FROM 
     tmp_DocumentEventCertificates AS tmp 
    WHERE 
     ([DocumentAttachment].[EventId] = tmp.[EventId]) AND 
     ([DocumentAttachment].[ParentDocumentAttachmentId] IS NOT NULL) 

    DROP TABLE tmp_DocumentEventCertificates 
END 

colonne [Thumbprint] est retirée de la table [DocumentEvent]. La colonne [Certificate_Thumbprint] est en cours d'ajout au tableau [DocumentAttachment].

Les données doivent être transférées de [DocumentEvent].[Thumbprint] à [DocumentAttachment].[Certificate_Thumbprint].

Ces scripts fonctionne comme prévu, lorsque la base de données est à l'état, ce qui nécessite la migration d'en haut, qui est, [DocumentEvent].[Thumbprint]existe et [DocumentAttachment].[Certificate_Thumbprint]n'existe pas.

Mais lors de la migration de la base de données, toutes les tentatives de déploiement de dacpac échouent en raison de l'erreur "Nom de colonne invalide 'Empreinte" ". Je suis presque sûr, que cela se produit parce que SQLCMD essaie de compiler le script de déploiement en entier, et cela pourrait être fait avec succès seulement quand [DocumentEvent].[Thumbprint] existe.

Mais quelle est la solution de contournement?

On dirait que IF EXISTS dans le premier script ne peut pas aider.

Répondre

2

Oui, vous avez raison, c'est une erreur de compilation. Si la colonne n'existe pas, votre script ne peut pas être compilé. IF Existe et les autres constructions de flux de données ne sont pas analysées.

Vous devez envelopper votre code produisant erreur de compilation dans EXEC:

exec(
'INSERT INTO 
     tmp_DocumentEventCertificates 
    SELECT 
     [EventId], 
     [Thumbprint] 
    FROM 
     [DocumentEvent] 
    WHERE 
     [Thumbprint] IS NOT NULL') 
+0

Merci beaucoup! Cela fonctionne pour moi. – Dennis