可以在SSIS中以编程方式完成ADO / ODBC连接下的“浏览”选项吗?

时间:2017-10-14 04:47:37

标签: ssis ado.net

所以我需要在查询中传递大约700k ID(每个大小为19个字符)以从Vertica DB中检索数据,我可以在SSIS中使用ODBC或ADO Connections,这是我发现可用的唯一方法这是通过脚本动态创建.sql文件。我以为我可以让连接源编辑器加载SQL命令文本的文件。第一部分完成并清理,我创建文件并且源从文件读取sql并在脚本完成sql命令的创建后检索信息并将其保存到.sql文件中,但是当我重写新的时文件,连接源不读取新文件(我保持相同的文件名只是覆盖内容),我通常通过ODBC源编辑器内的Builder查询旁边的浏览选项加载.sql文件。我的问题是,有没有办法强制查看.sql文件以加载内容并在每次循环数据flowTask时将其加载到sql命令文本中? enter image description here

2 个答案:

答案 0 :(得分:1)

您需要将.sql文件读入变量。最简单的可能是使用脚本任务读取SQL文件:

  1. 创建2个变量: scriptPath (String)用于存储SQL脚本的位置, sqlQuery (String)用于存储SQL脚本本身。
  2. 创建脚本任务并为其提供对这些变量的读/写访问权。
  3. 实现代码以读取SQL脚本文件。这是VB .Net中的一个例子(未经过测试的代码):
  4. Dim filePath As String
    filePath = Cstr(Me.Dts.Variables("scriptPath").Value)
    
    Dim streamReader As New StreamReader(filePath)
    Dim StreamText As String = streamReader.ReadToEnd()
    Me.Dts.Variables("sqlQuery").Value = StreamText
    
    1. 您现在可以在ADO connect中使用 sqlQuery 变量。

答案 1 :(得分:0)

SQL Server允许您在包含JOIN子句的复杂查询中使用链接服务器。

链接服务器

为Vertica DB配置链接服务器(请参阅create linked server to vertica)。

本地参考表

目标 SQL Server数据库中创建一个本地表,并使用您所需的ID填充它。例如:

CREATE TABLE dbo.tRef_Vertica_Transaction_Ids(
    [ID] INT NOT NULL PRIMARY KEY
)
-- Note: Having an index is important! It affects the query plan.
INSERT INTO dbo.tRef_Vertica_Transaction_Ids
SELECT *
FROM (VALUES
(123),(333),(999) -- Insert your ID's here
) Vals(v)

OPENQUERY

现在使用OPENQUERY检索您的数据。尝试使用多种查询类型来确定哪种方法最快:

OPENQUERY与WHERE EXISTS

SELECT v.*
FROM OPENQUERY([VerticaDB], 'SELECT * FROM SourceTable') v
WHERE EXISTS (
    SELECT 1
    FROM dbo.tRef_Vertica_Transaction_Ids ref
    WHERE ref.ID = v.ID
)

INENQUERY INNER JOIN

SELECT v.*
FROM OPENQUERY([VerticaDB], 'SELECT * FROM SourceTable') v
INNER JOIN dbo.tRef_Vertica_Transaction_Ids ref
    ON ref.ID = v.ID

OPENQUERY与INNER REMOTE JOIN

SELECT v.*
FROM OPENQUERY([VerticaDB], 'SELECT * FROM SourceTable') v
INNER REMOTE JOIN dbo.tRef_Vertica_Transaction_Ids ref
    ON ref.ID = v.ID

REMOTE JOIN强制在右表的站点上执行连接操作。

加入提示

SQL Server为您提供了这些连接提示:

  • INNER MERGE JOIN
  • INNER REMOTE JOIN
  • INNER LOOP JOIN
  • INNER HASH JOIN

有关每个Join Hints的详细信息。

使用MERGE JOINREMOTE JOIN可能会获得最佳效果,但在尝试之前,您不会知道。

约束您的查询

是的,你可以做SELECT * FROM SourceTable,但这可能不是最好的主意。您可以构造一个WHERE子句,它将显着减少您的结果集并使JOIN更有效。例如,您可以通过指定WHERE RecordCreatedDate > '2016-01-01'

之类的内容来限制结果集

您有一个有效的查询,将其存储在视图中。