SSIS中使用动态连接字符串变量的平面文件连接管理器新增列后提示文件未找到的问题排查
你遇到的这个问题我之前帮不少人排查过,结合你提到的细节,大概率和VS2017对映射驱动器的识别问题有关,但还有几个容易忽略的点需要咱们逐一确认:
映射驱动器的会话权限问题
你说VS2017识别不了映射驱动器,这真的是个常见的“坑”。映射驱动器是和当前用户会话绑定的,如果你是用管理员权限启动的VS2017,它会跑在独立的管理员会话里,这时候你普通用户会话里映射的H盘,在管理员会话中根本不存在——这就解释了为什么你手动验证连接字符串是对的,但包就是找不到文件。
给你两个解决方向:- 把映射驱动器换成UNC路径(推荐),比如把
H:\\MSSQL11.MSSQLSERVER\\MSSQL\\Dayforce\\改成\\你的服务器名\\MSSQL11.MSSQLSERVER\\MSSQL\\Dayforce\\,UNC路径不依赖用户会话,兼容性更强; - 如果必须用映射驱动器,要么启动VS2017时不要用管理员权限,要么在管理员会话里重新映射一次H盘(右键“此电脑”→映射网络驱动器,确保在管理员窗口操作)。
- 把映射驱动器换成UNC路径(推荐),比如把
新连接管理器的延迟验证没开
新创建的平面文件连接管理器默认是关闭延迟验证的,这会导致SSIS在包加载阶段就尝试解析连接字符串,但这时候变量的表达式可能还没完成计算(尤其是涉及到日期这类运行时才生成的值),自然找不到文件。
解决步骤很简单:
右键你的新平面文件连接管理器→打开属性,找到DelayValidation选项,把它改成True。这样SSIS会延迟到运行时再验证连接,这时候变量已经算出正确的文件名了。连接管理器的表达式绑定是否真的生效
虽然你确认了表达式计算结果正确,但还是要检查下新连接管理器的ConnectionString属性是否真的绑定了那个表达式——有时候创建新连接后,很容易忘记把旧连接的表达式复制过来,或者不小心绑定错了变量。
检查方式:右键新连接管理器→选择表达式,确认ConnectionString对应的表达式确实是@[User::LocalPath] + @[User::LocalFileName],而且没有语法错误。运行账户的文件权限问题
最后再排查下权限:不管文件存在与否,运行SSIS包的账户(比如你本地运行时的用户,或者SQL Server代理账户)可能没有访问H盘对应路径的读取权限。
可以手动用运行包的账户登录机器,尝试打开目标文件,如果打不开,就给该账户添加对应文件夹的读取权限;如果是SQL Server代理运行,用UNC路径更容易配置权限。
总结一下,优先试试把映射驱动器换成UNC路径,同时开启连接管理器的延迟验证,这两个操作解决大部分这类问题的概率很高。
内容的提问来源于stack exchange,提问作者Melanie




