代码之家  ›  专栏  ›  技术社区  ›  Tim Peters

SSIS中的动态连接字符串

  •  2
  • Tim Peters  · 技术社区  · 7 年前

    我在从SSIS变量填充XML文件的动态文件路径时遇到以下问题。

    在Visual Studio 2017中,我有一个带有MS SQL存储过程的执行SQL任务,该存储过程返回两列。第一列是日期(存储为字符串),第二列是URL。这两列(单行)填充SSIS变量,并映射到脚本任务的“结果集”选项卡上。下一步是脚本任务,它使用变量中的URL从web服务下载xml文件。xml文件使用文件连接管理器存储。文件的连接字符串是一个应使用第1个变量的表达式( User::rateDate )从执行SQL任务

    连接字符串表达式:

    @[User::xmlFileLocation] + "ExchangeRates-" +  @[User::rateDate]  + ".xml"
    

    其计算结果为

    \服务器\交换速率\交换速率-。xml

    XML文件应另存为 ExchangeRates-2017-12-19.xml 具有 2017-12-19 是存储过程的结果,但XML文件另存为 ExchangeRates-.xml

    如果我手动填充 用户::rateDate 变量,它将在连接字符串中使用该变量,但我无法从存储过程结果中填充它。

    生成的日期也是URL生成的一部分,因此我希望这两个文件都在同一个位置创建,也就是说,我不想通过 GETDATE() 表达式中的逻辑。

    我已确认正在填充的变量是一个脚本任务C#弹出窗口。

    我通过将存储过程结果更改为显式字符串(如“test”)来确认这不是日期/字符串问题。它仍然没有添加到连接字符串中。

    谢谢Tim

    Main tab Results tab Variables 2017

    2 回复  |  直到 7 年前
        1
  •  1
  •   Hadi    7 年前

    我将根据存储过程类型提供两种解决方案:

    带有Select语句的存储过程

    我假设您使用的存储过程包含一个SELECT语句,该语句返回一个包含2列的表: ServerURL rateDate

    在这种情况下,您必须将此select语句的结果插入临时表,然后从这些临时表中读取,例如:

    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
  •  0
  •   digital.aaron    7 年前

    更改变量的数据类型 User::rateDate 到datetime。然后,将连接字符串表达式更改为以下表达式:

    @[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"