我有一个 ETL 过程(在 SSIS 中),它从数据库中提取数据并将数据写入预定义的文本文件。目前,我手动创建目录和文件以满足此过程。
为了向这个过程添加一个新变量,我运行了一个 usp 将一个新行添加到一个表中,该行被读入 ETL 过程并确定要运行的包。
为了消除上述目录和文件的手动创建,并消除人为错误的可能性,我想在通过 usp 添加新行时创建新目录和文件。
简而言之; 我使用 来检查子目录是否存在xp_dirtree
,然后使用xp_create_subdir
创建新的子目录。我现在要做的是在新的子目录中创建一个空文本文件,在 ETL 过程中将数据写入其中。
我认为我有以下选择:
- 使用
xp_cmdshell
;我知道这会带来耻辱感,但如果这是最佳方式,我并不反对使用它。默认情况下这是禁用的,但我可以在 usp 中重新配置打开和关闭。 - 使用 fso;我在 .NET 脚本中使用过 fso,但没有在SQL Server中使用它的经验。我似乎找不到任何指示如何创建文本文件的资源,只能读写。
- 使用SSIS;在 ETL 项目中,我有一个平面文件连接管理器,其中连接字符串是根据变量的名称动态设置的。我不确定如果文本文件不存在是否会自动创建?我已经手动创建它们以避免任何失败的机会。如果文本文件是自动创建的,这可能是一个选项。
我故意将 BCP 排除在上面的选项之外,因为我没有要复制的结果集,因此假设这不是一个可行的选项?除非我可以“复制”一个空数据集来创建文本文件?
任何人都可以提供任何有用的资源来实现这一目标吗?或者任何人都可以提供有关如何最好地实现这一目标的任何指示吗?是xp_cmdshell
最好的办法吗?我想在创建新子目录时创建一个空文本文件。
在此先感谢您提供的任何帮助。
您可以使用SQL CLR。这允许(或多或少)从 SQL Server 中执行任何 C# 代码,就好像它是一个存储过程一样。这包括操作系统和文件系统操作。该代码可以接受来自 T-SQL 的值并向 T-SQL 返回值。可以像任何其他存储过程一样控制权限,回避 xp_cmdshell 的许多问题。