将 CSV 从 Azure blob 加载到 Azure SQL 的 SSIS 步骤

2024-01-06

我需要连接到 Azure blob(源)中的 CSV 文件,然后将数据加载到 Azure SQL Server 表中,然后将 CSV 文件移动到不同的(存档)Azure blob。

如果没有 Azure,我将创建一个到本地文件的平面文件连接,然后创建一个Data Flow task使用 Source Assistant 和 Destination Assistant 将数据加载到 SQL Server 表中,然后File System task in Control Flow将文件移至 Archive 目录。

我想做类似的事情,直接连接到 Azure Blob 中的文件,然后在数据流任务之后,将文件从一个 Azure Blob(源)移动到另一个 Azure Blob(存档)。

我能想到的最好的办法就是使用Azure Blob Download task将 CSV 移动到运行 SSIS 的 Azure VM(顺便问一下,您可以在没有 VM 的情况下获得 Azure SSIS 服务吗?),然后在下载后创建一个flat file connection & Data Flow加载数据,然后执行Azure Blob Upload task到存档 Blob。

似乎应该有一种方法可以连接到源 Azure blob 文件并直接从中读取,而无需先下载它。同样,似乎应该有一种方法可以在 Azure blob 容器之间移动文件。我能想到的最好的方法是下载/上传选项,但这需要中间位置(本地目录),并且下载后不会删除源文件。是否有 SSIS Azure 工具来执行这些任务?


对于问题的另一半有什么想法吗:在处理文件后将文件从源 blob 移动到存档 blob?

据我所知,没有任何内置任务可以帮助您实现此目的。根据我的测试,我认为您可以利用脚本任务 https://learn.microsoft.com/en-us/sql/integration-services/extending-packages-scripting/task/configuring-the-script-task-in-the-script-task-editor并编写代码(VB 或 C#)来直接处理 blob。下面是我的详细步骤,大家可以参考一下:

1) Use Azure Blob 源 https://learn.microsoft.com/en-us/sql/integration-services/data-flow/azure-blob-source and OLE DB 目标 https://learn.microsoft.com/en-us/sql/integration-services/lesson-1-7-adding-and-configuring-the-ole-db-destination under 数据流用于将 CSV 文件从 Azure Blob 加载到 Azure SQL 数据库中。

2) 成功将 CSV 数据加载到 SQL 表中后,使用脚本任务将源 blob 移动到存档 blob。

我将调用 Blob 服务 REST API复制斑点 https://learn.microsoft.com/en-us/rest/api/storageservices/fileservices/copy-blob and 删除斑点 https://learn.microsoft.com/en-us/rest/api/storageservices/fileservices/delete-blob with 容器 SAS 令牌 https://learn.microsoft.com/en-us/azure/storage/storage-dotnet-shared-access-signature-part-2,你可以利用微软Azure存储资源管理器 http://storageexplorer.com/并关注这位官方tutorial https://learn.microsoft.com/en-us/azure/vs-azure-tools-storage-explorer-blobs#get-the-sas-for-a-blob-container为 Blob 容器生成 SAS 令牌。

假设源 blob 和目标 blob 位于同一容器下,那么我添加三个变量(SourceBlobUrl,ContainerSasToken,ArchiveBlobUrl) 如下并将它们添加为 ReadOnlyVariables脚本任务编辑器,你可以参考这个tutorial https://learn.microsoft.com/en-us/sql/integration-services/extending-packages-scripting/task/using-variables-in-the-script-task用于在脚本任务中使用变量。

Click 编辑脚本脚本任务编辑器下的按钮启动 VSTA 开发环境,您可以在其中编写自定义脚本。这是下面的Main方法ScriptMain.cs如下:

public async void Main()
{
    // TODO: Add your code here
    string sasToken = Dts.Variables["ContainerSasToken"].Value.ToString();
    string sourceBlobUrl = Dts.Variables["SourceBlobUrl"].Value.ToString();
    string archiveBlobUrl = Dts.Variables["ArchiveBlobUrl"].Value.ToString();

    try
    {
        HttpClient client = new HttpClient();
        client.DefaultRequestHeaders.Add("x-ms-copy-source", sourceBlobUrl + sasToken);
        //copy source blob to archive blob
        Dts.Log($"start copying blob from [{sourceBlobUrl}] to [{archiveBlobUrl}]...", 0, new byte[0]);
        HttpResponseMessage response = await client.PutAsync(archiveBlobUrl + sasToken, null);
        if (response.StatusCode == HttpStatusCode.Accepted || response.StatusCode == HttpStatusCode.Created)
        {
            client.DefaultRequestHeaders.Clear();
            Dts.Log($"start deleting blob [{sourceBlobUrl}]...", 0, new byte[0]);
            //delete source blob
            HttpResponseMessage result = await client.DeleteAsync(sourceBlobUrl + sasToken);
            if (result.StatusCode == HttpStatusCode.Accepted || result.StatusCode == HttpStatusCode.Created)
            {
                Dts.TaskResult = (int)ScriptResults.Success;
                return;
            }
        }
        Dts.TaskResult = (int)ScriptResults.Failure;
    }
    catch (Exception ex)
    {
        Dts.Events.FireError(-1, "Script Task - Move source blob to an archive blob", ex.Message + "\r" + ex.StackTrace, String.Empty, 0);
        Dts.TaskResult = (int)ScriptResults.Failure;
    }
}

Result

此外,您还可以利用适用于 .NET 的 Microsoft Azure 存储客户端库 https://learn.microsoft.com/en-us/azure/storage/storage-dotnet-how-to-use-blobs要访问存储blob,此时需要在GAC之外的SSIS脚本任务中加载程序集,更多详细信息可以参考官方的这篇文章blog https://blogs.msdn.microsoft.com/dbrowne/2014/06/25/how-to-load-an-assembly-in-a-ssis-script-task-that-isnt-in-the-gac/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 CSV 从 Azure blob 加载到 Azure SQL 的 SSIS 步骤 的相关文章

  • Visual Studio 2010 与 SQL Server 2012 商业智能的正确安装顺序

    我有一个 Windows 7 64 位 旗舰版 虚拟机 想要安装以下内容 Visual Studio 2010 Ultimate SQL Server 2012 Business Intelligence with SSIS and SSR
  • 使用 Switch 的报告服务表达式

    我无法让这个表达式与报告服务一起使用 我必须使用 IF 和 ELSE IF 语句 感谢您的任何建议 Switch IsNothing Fields field date Value Fields set flag Value 1 Decli
  • 限制 SQL Server 连接到特定 IP 地址

    我想将 SQL Server 实例的连接限制为特定 IP 地址 我想阻止来自除特定列表之外的任何 IP 地址的任何连接 这是可以在 SQL Server 实例或数据库中配置的东西吗 听起来像是你会使用Windows防火墙 http tech
  • 使用多行选项和编码选项读取 CSV

    在 azure Databricks 中 当我使用以下命令读取 CSV 文件时multiline true and encoding SJIS 似乎编码选项被忽略了 如果我使用multiline选项 Spark 使用默认值encoding那
  • 有谁知道一种更快的方法来执行 String.Split() 吗?

    我正在读取 CSV 文件的每一行 并且需要获取每一列中的各个值 所以现在我只是使用 values line Split delimiter where line是保存由分隔符分隔的值的字符串 衡量我的表现ReadNextRow我注意到它花费
  • 发布管道中的 Azure DevOps 日志记录命令

    我试图通过在任务中设置一些环境变量来自定义管道版本的输出 我找到了以下链接 然而这似乎不起作用 我所做的只是创建一个具有单个任务 bash 或 PS 的管道 并通过任务的内联版本声明链接中指定的命令 有人已经成功地使这些命令起作用了吗 我做
  • Azure Function Blob 触发器 CloudBlockBlob 绑定

    当文件上传到 Blob 存储时 我会触发以下 Azure 函数 FunctionName ImageAnalysis public static async void Run BlobTrigger imageanalysis name C
  • 如何在 Visual Studio 中更改 Azure 数据库表的列顺序

    我整个下午都在寻找在 MS Visual Studio 2022 中重新排序 Azure 数据库表列的方法 没有运气 在其他应用程序中 可以通过拖动或剪切和粘贴轻松重新排列列 这里无能为力 此时 我什至不确定可以在 VS 中移动列 我只对
  • 避免连接失败时出现空指针

    我有我的域类 带有命名查询 class Atendimento implements Serializable Funcionario funcionario static mapping funcionario column FUNCOD
  • 通过PowerShell检索Azure AD应用程序的“API权限”

    出于报告和监视的目的 我想检索应用程序 应用程序注册 的 Azure 门户中显示的信息以获取 API 权限 我尝试过以下代码 app Get AzureADApplication ObjectId aa7e174d 2639 4ac7 9b
  • sql server 按组排名

    问题看似简单 但我却无法理解 这是针对 sql 服务器的 what I have in a table What I need as a output cksum id cksum id 2162514679 204 2162514679
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 探查器模板可以迁移到较新版本的 SQL Profiler 吗?

    是否可以将 Profiler 模板迁移到较新版本的 SQL Server 就我而言 我想将 SQL 2008 模板带到 2012 年 我尝试过 1 直接文件复制和 2 导出 导入 在这两种情况下 旧模板都会运行 但无法修改 修改后会出现以下
  • 选择具有 SQL Server XML 列类型的特定行

    我正在尝试从类似于以下定义的表中选择数据 Column Data Type Id Int DataType Int LoggedData XML 但我只想选择具有特定 DataType 值并且在 LoggedData 列中包含字符串 或评估
  • 单独的逗号分隔值并存储在sql server的表中

    我有一个存储过程 它将逗号分隔的值作为输入 我需要将其分开并需要将其作为单独的行存储在表中 令 SP 的输入为 Rule ID ListType ID Values 1 2 319 400 521 8465 2013 我需要将它存储在一个名
  • 更改表分布(Azure 数据仓库)

    在急着下班的过程中 我在一个采用循环分配的新桌子上运行了一个大型插入 我知道这不太可能 但是有没有办法将表的分布从循环更改为哈希分布 很遗憾ALTER TABLE不支持更改 Azure SQL 数据仓库中表的分布 您可以做的下一个最好的事情
  • C#的数组列表可以用来填充SSIS对象变量吗?

    我已在 C 脚本中填充了一个列表 并将其值分配给 SSIS 对象变量 然后 我使用该对象变量通过循环遍历 For every do 枚举器来执行一些 SQL 查询 我尝试通过 Foreach ado 枚举器执行此操作 但出现错误 X 变量不
  • 将表数据从一个 SQL Server 导出到另一台 SQL Server

    我有两个 SQL Server 都是 2005 版本 我想将多个表从一个表迁移到另一个表 我努力了 在源服务器上 我右键单击数据库 选择Tasks Generate scripts 问题是在下面Table View options没有Scr
  • Android访问远程SQL数据库

    我可以直接从 Android 程序访问远程 SQL 数据库 在网络服务器上 吗 即简单地打开包含所有必需参数的连接 然后执行 SQL 查询 这是一个私人程序 不对公众开放 仅在指定的手机上可用 因此我不担心第三方获得数据库访问权限 如果是这
  • Visual Studio 2010 中的数据库设计器

    我需要创建一个全新的 Sql Server 2008 数据库 并希望使用 Visual Studio 2010 Ultimate 中的数据库项目 我已经创建了该项目并在下面添加了一个表格dbo架构 桌子 sql仅以纯文本形式显示 但带有颜色

随机推荐