从数据流中的所有 (n)varchar 字段中删除换行符的 SSIS 组件
SSIS component to remove linefeeds from all (n)varchar fields in dataflow
我使用 SSIS 组件从 API 检索数据。
API 交付 XML,
这个 XML 包含
像这样的数据:
<tag>
code
</tag>
'code'
前后换行
这意味着在 SQL 中输入我的 (n)varchar 列的内容如下所示:
CHAR(10)codeCHAR(10)
这很混乱,其中包括报告中的内容。
所以 CHAR(10) 需要消失。它需要在我的数据流中的源组件和目标组件之间被过滤掉。
我可以为此使用派生列,但它涉及 9 个数据流(总共)385 (n)varchar 字段。
很多工作!
是否可以使用对每个 (n)varchar 执行 replace(field,linefeed,'')
的脚本组件?以便所有数据都通过此组件并退出时去掉换行符?
如果是这样,我该怎么做?
我对 SQL 很满意,可以阅读大多数语言,但在用 VB.NET 的 C# 编写此代码时需要一些帮助。
我正在 VS2019 中设计它并部署到 ADFv2 IS。目标是 SQL 个 Azure 数据库。
我不能在 SSIS 作业 运行 之后简单地 运行 一些 SQL 因为下一个 运行 将对数据进行更新插入。然后它将断定 CHAR(10)codeCHAR(10)
不同于 code
并插入一个新行,这违反了 code
上的唯一约束。所以这就是为什么我需要在获取数据之后和写入数据之前进行操作。
您不一定需要 SSIS 来执行此操作。您可以在 SQL Server 2017 及更高版本和 Azure SQL DB 中使用 TRIM
函数。将您的 XML 插入暂存 table 中,与原始版本保持不变。然后调用清理 XML 的存储过程,并可选择将其插入另一个 table。一个例子:
--INSERT INTO ...
SELECT
TRIM( CHAR(10) + CHAR(13) FROM someXML.value( '(tag/text())[1]', 'VARCHAR(20)' ) ) trimmedTag
FROM xmlTest
TRIM 使您可以选择添加要删除的字符。在上面的示例中,我使用 CHAR
函数分别删除了换行符 (10) 和回车符 return (13)。
在 SSIS 中,您可以使用执行 SQL 任务来调用过程。
我找不到不需要大量编码但会牺牲性能的解决方案。
我尝试的一种解决方案是将 XML 编写为 CSV,在 CSV 上进行搜索和替换,然后将其导入 table。
虽然它有效,但它使解决方案变得不必要的复杂并且在性能方面是有害的。这是在对抗症状,而不是解决问题。
所以我去和提供 API 的人交谈,他们删除了这些换行符。事实证明这是唯一好的解决方案。
我使用 SSIS 组件从 API 检索数据。 API 交付 XML, 这个 XML 包含 像这样的数据:
<tag>
code
</tag>
'code'
前后换行这意味着在 SQL 中输入我的 (n)varchar 列的内容如下所示:
CHAR(10)codeCHAR(10)
这很混乱,其中包括报告中的内容。
所以 CHAR(10) 需要消失。它需要在我的数据流中的源组件和目标组件之间被过滤掉。
我可以为此使用派生列,但它涉及 9 个数据流(总共)385 (n)varchar 字段。
很多工作!
是否可以使用对每个 (n)varchar 执行 replace(field,linefeed,'')
的脚本组件?以便所有数据都通过此组件并退出时去掉换行符?
如果是这样,我该怎么做? 我对 SQL 很满意,可以阅读大多数语言,但在用 VB.NET 的 C# 编写此代码时需要一些帮助。 我正在 VS2019 中设计它并部署到 ADFv2 IS。目标是 SQL 个 Azure 数据库。
我不能在 SSIS 作业 运行 之后简单地 运行 一些 SQL 因为下一个 运行 将对数据进行更新插入。然后它将断定 CHAR(10)codeCHAR(10)
不同于 code
并插入一个新行,这违反了 code
上的唯一约束。所以这就是为什么我需要在获取数据之后和写入数据之前进行操作。
您不一定需要 SSIS 来执行此操作。您可以在 SQL Server 2017 及更高版本和 Azure SQL DB 中使用 TRIM
函数。将您的 XML 插入暂存 table 中,与原始版本保持不变。然后调用清理 XML 的存储过程,并可选择将其插入另一个 table。一个例子:
--INSERT INTO ...
SELECT
TRIM( CHAR(10) + CHAR(13) FROM someXML.value( '(tag/text())[1]', 'VARCHAR(20)' ) ) trimmedTag
FROM xmlTest
TRIM 使您可以选择添加要删除的字符。在上面的示例中,我使用 CHAR
函数分别删除了换行符 (10) 和回车符 return (13)。
在 SSIS 中,您可以使用执行 SQL 任务来调用过程。
我找不到不需要大量编码但会牺牲性能的解决方案。 我尝试的一种解决方案是将 XML 编写为 CSV,在 CSV 上进行搜索和替换,然后将其导入 table。 虽然它有效,但它使解决方案变得不必要的复杂并且在性能方面是有害的。这是在对抗症状,而不是解决问题。 所以我去和提供 API 的人交谈,他们删除了这些换行符。事实证明这是唯一好的解决方案。