首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ADO/ODBC连接下的Browse选项是否可以在SSIS中以编程方式完成?

ADO/ODBC连接下的Browse选项是否可以在SSIS中以编程方式完成?
EN

Stack Overflow用户
提问于 2017-10-14 04:47:37
回答 2查看 123关注 0票数 0

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

EN

回答 2

Stack Overflow用户

发布于 2017-10-14 05:05:21

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

  1. 创建两个变量:scriptPath (String)用于存储SQL脚本的位置,sqlQuery (String)用于存储SQL脚本本身。
  2. 创建脚本任务并为其提供对这些SQL脚本文件的读/写访问权限。这里有一个VB .Net的例子(代码未测试):

代码语言:javascript
运行
AI代码解释
复制
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连接中使用sqlQuery变量。
票数 1
EN

Stack Overflow用户

发布于 2017-10-16 03:56:15

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

链接服务器

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

本地引用表

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

代码语言:javascript
运行
AI代码解释
复制
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 with WHERE EXISTS

代码语言:javascript
运行
AI代码解释
复制
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
)

使用INNER的OPENQUERY

代码语言:javascript
运行
AI代码解释
复制
SELECT v.*
FROM OPENQUERY([VerticaDB], 'SELECT * FROM SourceTable') v
INNER JOIN dbo.tRef_Vertica_Transaction_Ids ref
    ON ref.ID = v.ID

使用内部远程连接的OPENQUERY

代码语言:javascript
运行
AI代码解释
复制
SELECT v.*
FROM OPENQUERY([VerticaDB], 'SELECT * FROM SourceTable') v
INNER REMOTE JOIN dbo.tRef_Vertica_Transaction_Ids ref
    ON ref.ID = v.ID

远程联接强制在右表的站点上执行联接操作。

连接提示

SQL Server为您提供以下联接提示:

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

更多关于每个人的信息,请访问Join Hints

使用MERGE JOINREMOTE JOIN可能会获得最佳性能,但只有在尝试之后才能知道。

约束您的查询

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46740975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文