如何将SSIS中CSV下载的C#代码移至SQL Server 2017存储过程执行?
将SSIS中的C#下载CSV代码嵌入SQL Server 2017存储过程的方法
要把你的C#下载逻辑搬进SQL Server存储过程,核心是利用SQL CLR集成,以下是完整实操步骤:
1. 开启SQL Server CLR集成
默认情况下SQL Server禁用CLR,先执行以下语句开启:
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'clr enabled', 1; RECONFIGURE;
2. 调整C#代码为CLR兼容格式
把原SSIS中的C#代码改成类库项目,满足CLR存储过程的要求:
- 类设为
public,方法设为public static - 给方法添加
[Microsoft.SqlServer.Server.SqlProcedure]特性 - 保留原有的下载逻辑,确保处理网络访问和文件IO的权限需求
示例调整后的C#代码:
using System; using System.IO; using System.Net; using Microsoft.SqlServer.Server; public class FileDownloader { [SqlProcedure] public static void DownloadCsvFromUrl(string sourceUrl, string targetFilePath) { // 替换成你原有的下载逻辑,可添加身份验证、超时等扩展 using (WebClient client = new WebClient()) { client.DownloadFile(sourceUrl, targetFilePath); } } }
3. 编译C#代码为DLL
用Visual Studio编译成.NET Framework类库(SQL Server 2017支持.NET Framework 4.6.1及以上版本,编译时选择对应版本),得到FileDownloader.dll文件。
4. 在SQL Server中创建程序集
将编译好的DLL部署到SQL Server,根据需求选择权限集:
- 仅需网络+本地IO:用
EXTERNAL_ACCESS - 需要调用非托管代码等高级权限:用
UNSAFE
执行以下T-SQL创建程序集:
-- 若使用EXTERNAL_ACCESS,先设置数据库为TRUSTWORTHY(生产环境建议用证书签名替代,更安全) ALTER DATABASE YourDatabaseName SET TRUSTWORTHY ON; CREATE ASSEMBLY FileDownloaderAssembly FROM 'C:\Your\DLL\Path\FileDownloader.dll' WITH PERMISSION_SET = EXTERNAL_ACCESS;
5. 创建CLR存储过程
基于程序集创建存储过程,映射到C#方法:
CREATE PROCEDURE dbo.DownloadCsv @SourceUrl NVARCHAR(2048), @TargetFilePath NVARCHAR(2048) AS EXTERNAL NAME FileDownloaderAssembly.FileDownloader.DownloadCsvFromUrl;
6. 测试存储过程
调用存储过程验证功能:
EXEC dbo.DownloadCsv @SourceUrl = 'https://your-datasource-url/target.csv', @TargetFilePath = 'C:\Local\Save\Path\downloaded_file.csv';
7. 每日自动调度(可选)
如果需要每日执行,创建SQL Server代理作业,步骤选择“Transact-SQL脚本”,调用上述存储过程即可。
关键注意事项
- 确保SQL Server服务账户拥有目标目录的写入权限,以及访问数据源URL的网络权限
TRUSTWORTHY ON会降低数据库安全性,生产环境优先用证书签名程序集替代- 若原C#代码依赖第三方库,需将依赖DLL一同部署为SQL Server程序集
内容的提问来源于stack exchange,提问作者vincevangone
相关产品推荐
相关产品推荐

