使用数据迁移脚本时出现“列名无效”错误
问题描述:
我的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
在第一脚本不能帮助。
答
是的,你是对的,它的编译错误。 如果该列不存在,则不能编译脚本。 如果没有分析存在和其他数据流结构。
你应该换你的代码在EXEC产生编译错误:
exec(
'INSERT INTO
tmp_DocumentEventCertificates
SELECT
[EventId],
[Thumbprint]
FROM
[DocumentEvent]
WHERE
[Thumbprint] IS NOT NULL')
非常感谢!这对我有用。 – Dennis