在整个上午的大部分时间里,我一直在努力解决这个问题,我准备建议这是SqlPackage.exe中的错误
我使用以下命令提取dacpac:
C:\"Program Files"\"Microsoft SQL Server"\150\DAC\bin\SqlPackage.exe /a:Extract /ssn:$server /sdn:$dbName /st:300 /p:CommandTimeout=300 /tf:obj\$dbName\extracted.dacpac
并使用以下命令发布脚本:
C:\"Program Files"\"Microsoft SQL Server"\150\DAC\bin\SqlPackage.exe /a:Script /tcs:"Server=$server`;Database=$newDbName`;Trusted_Connection=True`;Connection Timeout=300`;" /p:CommandTimeout=300 /p:ExcludeObjectType=Logins /p:ExcludeObjectType=Users /p:ExcludeObjectType=RoleMembership /p:IgnoreNotForReplication=true /p:UnmodifiableObjectWarnings=false /sf:obj\$dbName\extracted.dacpac /op:obj\$dbName\publish_script.sql
该脚本会生成,但是当我尝试执行该错误时会失败:
Procedure MY_FUNCTION, Line 39 Invalid object name 'MY_OTHER_FUNCTION'
如果我检查脚本,可以看到以下内容:
LINE 300: PRINT N'Creating [dbo].[MY_FUNCTION]...'
... More code ...
LINE 400: PRINT N'Creating [dbo].[MY_OTHER_FUNCTION]...';
我已经深入研究提取的dacpac,以确认model.xml正在获取MY_FUNCTION对MY_OTHER_FUNCTION的依赖关系。我还验证了这不是循环依赖的情况。 MY_OTHER_FUNCTION依赖于在LINE 100上创建的一张表。
为什么生成的脚本无法按顺序创建它们?
答案 0 :(得分:0)
好的,我确定这是一个错误。重现步骤:
运行以下创建脚本:
在[PRIMARY]上创建表[dbo]。[someTable]([Id] [int] IDENTITY(1,1)NOT FOR REPLICATION NOT NULL) 开始
创建函数[dbo]。[someOtherFunction](@ Id INT = 1)返回@someResults表(Id INT) 如 开始 插入@someResults(Id) SELECT * FROM [sqlpackagebug]。[dbo]。[someTable] st WHERE @Id = st.Id 返回; 结束 开始
创建函数[dbo]。[someFunction](@ Id INT = 1)返回表 如 返回 ( SELECT * FROM [sqlpackagebug]。[dbo] .someOtherFunction ) 开始
使用以下方法提取dacpac:
C:\"Program Files"\"Microsoft SQL Server"\150\DAC\bin\SqlPackage.exe /a:Extract /ssn:$server /sdn:$dbName /st:300 /p:CommandTimeout=300 /tf:extracted.dacpac
使用以下命令创建脚本
C:\"Program Files"\"Microsoft SQL Server"\150\DAC\bin\SqlPackage.exe /a:Script /tsn:$server /tdn:$newDbName /tt:300 /p:CommandTimeout=300 /sf:extracted.dacpac /op:script.sql
查看脚本,您会发现未按正确的顺序创建函数。该脚本将失败。