2017-10-12 48 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

相关问题