【发布时间】:2018-02-14 02:10:02
【问题描述】:
这里是 SSIS 新手。
我有一个基于向导创建的 SSIS 包。我添加了一个 SQL 任务来单独运行我之前运行的脚本,以便将过程减少到一个步骤。该脚本使用大量临时表,最后使用一个全局##temp 以使结果可在进程外部访问。
当我尝试执行包时,我收到一个复杂的“包验证错误”(错误代码 0x80040E14)。我认为错误消息的操作部分是“无效的对象名称'##roster5'。”
我刚刚意识到是数据流任务引发了错误,所以我尝试将另一个 SQL 任务放在创建表的所有其他内容之前,以便数据流任务会看到表在那里;但它仍然给我错误:“无效的对象名称'##ROSTER_MEMBER_NEW5'。”
我错过了什么/做错了什么?我不知道我不知道什么。看起来这不应该那么复杂(作为一个新手,我知道这可能是...的副本,但我不知道该怎么问这个问题。)
【问题讨论】:
-
有一些解决方案。首先告诉我你希望在##roster5, ##roser)member_news5 中有多少行。
-
哎呀,##roster5 只是全名的缩写;脚本生成了大约 500 万行
-
您会看到一些将#temp 表转换为表变量(例如@temptable)的建议。优化器会将变量表视为具有单行的表,这会影响性能。您还将看到其他建议,例如 set frmt off (stackoverflow.com/questions/1579476/using-temp-tables-in-ssis) 。这也会导致性能下降。我会创建一个带有可识别模式的临时表,填充它,然后通过截断。
-
超过 5M 行的表变量??!??!!我已经尝试添加您发布的线程建议的一些内容。直接在 PROC 中: SET NOCOUNT ON SET FMTONLY OFF SELECT TOP 0 field = CAST(NULL AS INT) IF 1 = 0 BEGIN -- Publish metadata SELECT CAST (NULL AS INT) AS id, CAST (NULL AS NCHAR (10)) AS [Name], CAST (NULL AS NCHAR ( 10 )) AS SirName END 在调用对象中: IF 1 = 0 BEGIN SELECT CAST(null as int) AS Foo END;执行 usp_WaterfallLogic
-
另一件事:在对象中预先创建表:SELECT TOP 0 field = CAST(NULL AS INT);如果 OBJECT_ID('tempdb..##ROSTER_MEMBER_NEW5') 不为空 drop table ##ROSTER_MEMBER_NEW5 create table ##ROSTER_MEMBER_NEW5 (...
标签: ssis proc validationerror global-temp-tables