因此,我需要在一个查询中传递大约700k个ids (每个ids的大小为19个字符)来从Vertica DB检索数据,我可以在SSIS中使用ODBC或ADO Connections,唯一可用的方法是通过脚本动态创建一个.sql文件。我想我可以让connection Source Editor加载SQL命令文本的文件。第一部分是完成和清理,我创建文件和源读取的sql从文件和检索信息后,脚本完成创建的sql命令,并将其保存到一个.sql文件,但是当我重写新文件,连接源不读取新文件(我保持相同的文件名只是覆盖内容),我通常通过浏览选项加载.sql文件,旁边的生成器查询的ODBC源代码编辑器。我的问题是,有没有一种方法可以在每次循环数据flowTask时强制查看.sql文件,以加载内容并将其加载到sql命令文本中?
发布于 2017-10-14 05:05:21
您需要将.sql文件读取到一个变量中。最简单的方法可能是使用脚本任务读取SQL文件:
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
发布于 2017-10-16 03:56:15
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 with 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
)
使用INNER的OPENQUERY
SELECT v.*
FROM OPENQUERY([VerticaDB], 'SELECT * FROM SourceTable') v
INNER JOIN dbo.tRef_Vertica_Transaction_Ids ref
ON ref.ID = v.ID
使用内部远程连接的OPENQUERY
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为您提供以下联接提示:
更多关于每个人的信息,请访问Join Hints。
使用MERGE JOIN
或REMOTE JOIN
可能会获得最佳性能,但只有在尝试之后才能知道。
约束您的查询
是的,你可以做SELECT * FROM SourceTable
,但这可能不是最好的主意。您可能会构造一个WHERE子句,它将显著减少结果集,并使连接更有效。例如,您可以通过指定类似WHERE RecordCreatedDate > '2016-01-01'
的内容来限制您的结果集。
如果您有一个有效的查询,请将其存储在视图中。
https://stackoverflow.com/questions/46740975
复制