SSIS 中的动态连接字符串
Dynamic connection string in SSIS
我在从 SSIS 变量填充 XML 文件的动态文件路径时遇到以下问题。
在 Visual Studio 2017 年,我有一个执行 SQL 任务,其中包含 returns 两列的 MS SQL 存储过程。第一列是日期(存储为字符串),第二列是 URL。这两列(单行)填充 SSIS 变量并映射到脚本任务的结果集选项卡上。下一步是脚本任务,它使用变量中的 URL 从 Web 服务下载 xml 文件。 xml 文件是使用文件连接管理器存储的。该文件的连接字符串是一个表达式,应该使用执行 SQL 任务
中的第一个变量 (User::rateDate
)
连接字符串表达式:
@[User::xmlFileLocation] + "ExchangeRates-" + @[User::rateDate] + ".xml"
计算结果为
\server\ExchangeRates\ExchangeRates-.xml
XML 文件应保存为 ExchangeRates-2017-12-19.xml
,其中 2017-12-19
是存储过程的结果,但 XML 文件保存为 ExchangeRates-.xml
如果我手动填充 User::rateDate
变量,它将在连接字符串中使用它,但我无法从存储过程结果中填充它。
生成的日期也是 URL 生成的一部分,所以我希望这两个都在同一个地方创建,即我不想通过某些 GETDATE()
逻辑分配文件名表达式。
我已确认正在填充的变量是一个脚本任务 C# 弹出窗口。
我已通过将存储过程结果更改为显式字符串(如 "test")确认这不是 date/string 问题。它仍然没有被添加到连接字符串中。
谢谢,提姆
将变量 User::rateDate
的数据类型更改为日期时间。然后,将您的连接字符串表达式更改为以下内容:
@[User::xmlFileLocation] +
"ExchangeRates-" +
(DT_WSTR,4)DATEPART("yyyy",@[User::rateDate]) +
RIGHT("0" + (DT_WSTR,2)DATEPART("mm",@[User::rateDate]) ,2) +
RIGHT("0" + (DT_WSTR,2)DATEPART("dd",@[User::rateDate]),2) +
".xml"
我将根据存储过程类型提供2种解决方案:
带有 Select 语句的存储过程
我假设您正在使用包含 SELECT 语句的存储过程,该语句 return 2 列的 Table:ServerURL
和 rateDate
在这种情况下,您必须将此 select 语句的结果插入临时文件 table,然后从这些临时文件 table 中读取,例如:
CREATE TABLE #TBL(ServerURL varchar(4000), rateDate varchar(50))
INSERT INTO #TBL EXEC pr_rateDate
SELECT TOP 1 * FROM #TBL
通过这种方式,您的变量映射应该可以工作
带输出参数的存储过程
我假设您正在使用需要传递 2 个输出参数的存储过程,例如:
EXEC sp_rateDate @ServerURL OUTPUT, @rateDate OUTPUT
因此您必须使用以下 SQL 语句:
EXEC sp_rateDate ? OUTPUT, ? OUTPUT
并且您必须在 参数映射 选项卡中添加 2 个输出参数
有用的链接
我在从 SSIS 变量填充 XML 文件的动态文件路径时遇到以下问题。
在 Visual Studio 2017 年,我有一个执行 SQL 任务,其中包含 returns 两列的 MS SQL 存储过程。第一列是日期(存储为字符串),第二列是 URL。这两列(单行)填充 SSIS 变量并映射到脚本任务的结果集选项卡上。下一步是脚本任务,它使用变量中的 URL 从 Web 服务下载 xml 文件。 xml 文件是使用文件连接管理器存储的。该文件的连接字符串是一个表达式,应该使用执行 SQL 任务
中的第一个变量 (User::rateDate
)
连接字符串表达式:
@[User::xmlFileLocation] + "ExchangeRates-" + @[User::rateDate] + ".xml"
计算结果为
\server\ExchangeRates\ExchangeRates-.xml
XML 文件应保存为 ExchangeRates-2017-12-19.xml
,其中 2017-12-19
是存储过程的结果,但 XML 文件保存为 ExchangeRates-.xml
如果我手动填充 User::rateDate
变量,它将在连接字符串中使用它,但我无法从存储过程结果中填充它。
生成的日期也是 URL 生成的一部分,所以我希望这两个都在同一个地方创建,即我不想通过某些 GETDATE()
逻辑分配文件名表达式。
我已确认正在填充的变量是一个脚本任务 C# 弹出窗口。
我已通过将存储过程结果更改为显式字符串(如 "test")确认这不是 date/string 问题。它仍然没有被添加到连接字符串中。
谢谢,提姆
将变量 User::rateDate
的数据类型更改为日期时间。然后,将您的连接字符串表达式更改为以下内容:
@[User::xmlFileLocation] +
"ExchangeRates-" +
(DT_WSTR,4)DATEPART("yyyy",@[User::rateDate]) +
RIGHT("0" + (DT_WSTR,2)DATEPART("mm",@[User::rateDate]) ,2) +
RIGHT("0" + (DT_WSTR,2)DATEPART("dd",@[User::rateDate]),2) +
".xml"
我将根据存储过程类型提供2种解决方案:
带有 Select 语句的存储过程
我假设您正在使用包含 SELECT 语句的存储过程,该语句 return 2 列的 Table:ServerURL
和 rateDate
在这种情况下,您必须将此 select 语句的结果插入临时文件 table,然后从这些临时文件 table 中读取,例如:
CREATE TABLE #TBL(ServerURL varchar(4000), rateDate varchar(50))
INSERT INTO #TBL EXEC pr_rateDate
SELECT TOP 1 * FROM #TBL
通过这种方式,您的变量映射应该可以工作
带输出参数的存储过程
我假设您正在使用需要传递 2 个输出参数的存储过程,例如:
EXEC sp_rateDate @ServerURL OUTPUT, @rateDate OUTPUT
因此您必须使用以下 SQL 语句:
EXEC sp_rateDate ? OUTPUT, ? OUTPUT
并且您必须在 参数映射 选项卡中添加 2 个输出参数