2017-10-12 92 views
1

我的SSDT項目中有幾個數據遷移腳本。從一個表到另一臨時表使用數據遷移腳本時出現「列名無效」錯誤

首先一個存儲數據:

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 

其次從臨時表中的一個將數據傳輸到另一個表:

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 

[Thumbprint]正在從[DocumentEvent]表中刪除。
[Certificate_Thumbprint]被添加到[DocumentAttachment]表。

數據必須被轉移從[DocumentEvent].[Thumbprint][DocumentAttachment].[Certificate_Thumbprint]

這些腳本正常工作,當數據庫的狀態,這需要遷移從上面,也就是[DocumentEvent].[Thumbprint]存在,並[DocumentAttachment].[Certificate_Thumbprint]不存在

但是,當遷移數據庫時,所有嘗試部署dacpac失敗,因爲 「無效的列名'Thumbprint'」錯誤。

我幾乎可以肯定,發生這種情況是因爲SQLCMD嘗試編譯整個部署腳本,只有當[DocumentEvent].[Thumbprint]存在時才能成功完成此操作。

但是,什麼是解決辦法?

貌似IF EXISTS在第一腳本不能幫助。

回答

2

是的,你是對的,它的編譯錯誤。 如果該列不存在,則不能編譯腳本。 如果沒有分析存在和其他數據流結構。

你應該換你的代碼在EXEC產生編譯錯誤:

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

非常感謝!這對我有用。 – Dennis

相關問題