SQL Server导入向导和临时表

时间:2018-07-16 19:12:48

标签: sql-server ssis

我有一个非常长的查询,因此为了可读起见,将其一分为二。

Select field_1, field_2
from table
into #temp;

Select field_1, field_2, field_1b
from #temp TMP 
Inner Join table_2 ON TMP.field_2b = field_2

在SQL Server Management Studio中很好用。

现在,我需要做一份将这些数据加载到另一个数据库的工作。我有一些进出口向导项目,可以正常工作。

在这种情况下,我无法使向导正常工作,它在#temp上引发错误。

我尝试了

 set fmtonly off

但是我超时了(超时值设置为0)

  • 来源是SQL Server 2014(v12)
  • 目标是SQL Server 2016(v13)

关于如何进行这项工作的任何想法,我的最后一个资源是从两个查询中进行一个查询,但是如果可能的话,希望保持一定的顺序和可读性。

谢谢!

3 个答案:

答案 0 :(得分:1)

如果仅出于可读性考虑将查询分为两个部分,则可以使用其他方式格式化查询,例如CTE:

WITH t1 AS (
    SELECT field_1, field_2
    FROM table
)
SELECT t1.field_1, t1.field_2, table_2.field_1b
FROM t1
    INNER JOIN table_2 ON t1.field_2 = table_2.field_2b;

虽然我无法开始推测性能(因为我对您的实际查询或基础架构一无所知),但这也可能会提高性能,因为它消除了填充临时表的开销。通常,您不应仅仅为了使查询“可读”而损害性能。

答案 1 :(得分:1)

首先,请发布错误消息。这通常是一个问题最启发性的一点,它可以使其他人帮助您。

由于您使用的是SSIS,请复制/粘贴在“输出”窗口中打印的内容?这就是您的错误消息的去处。

几点

fmtonly的用途完全不同,因此,如果fmtonly on / off之间的差异是您是否获得标头或标头和数据。请参阅以下带有fmtonly文档的链接:

  

https://docs.microsoft.com/en-us/sql/t-sql/statements/set-fmtonly-transact-sql?view=sql-server-2017

您是否尝试过替代临时表解决方案?这似乎是最有可能的罪魁祸首。这里有一些替代方法:

  1. 使用登台表(用于ETL的永久表);您将截断它,使用问题中提到的两个查询填充它,并将其传递给目标服务器,瞧!
  2. 使用CTE。尽管它们不是最容易阅读的,但这可以避免临时表问题。
  3. 不破坏查询的可读性。尽管可以消除麻烦,但这可能并不有趣。

尽管没有错误消息,我还有其他要点可以帮助您。

答案 2 :(得分:0)

当您不发布如何将数据加载到另一个数据库时,这很难确定问题

但是我建议您使用半永久性的Temp表。

因此,您在作业开始时创建实际表,并在作业完成后删除所述表。请记住,您可以在工作中执行多个步骤,而不必在同一查询中。