使用 SSIS 传输包含 SQL 的 CSV 文件。
我正在使用 .NET 创建一个 CSV 文件,然后使用 SSIS 包将其传输到表中。
该文件的内容是一个 36 字符的 GUID 和任何可能包含制表符、管道字符和可能任何可键入字符的 SQL 文本。我想我会使用 Windows CharMap 附件实用程序指定我自己的列和行分隔符来为分隔符选择不可键入的字符。我分别选择了 ¼ 和 ½ 作为列和行分隔符。
我创建的测试文件如下所示:
Guid¼Sql½3afc912b-917d-4719-8ded-22e5d95930a3¼SELECT
* FROM
TABLE½a867fa30-f2c7-459e-8985-9ef42616991e¼SELECT
* FROM
TABLE½
文件 SSIS 文件连接将列定义为
Guid: string [DT_STR] 36
Sql: text stream [DT_TEXT]
我将其传输到以下 SQL Server 目标表:
CREATE TABLE [dbo].[CodeObjectSql](
[Guid] [char](36) NOT NULL,
[Sql] [varchar](max) NOT NULL
) ON [PRIMARY]
当我预览文件时,列分隔符显示为 guid 第一列的最后一个(第 37 个)字符,行分隔符显示为 SQL 列值的最后一个字符。
这是我得到的错误:
Error: 0xC02020A1 at Load CodeObjectSql, CodeObjectSql File [1]: Data conversion failed. The data conversion for column "Guid" returned status value 4 and status text "Text was truncated or one or more characters had no match in the target code page.".
Error: 0xC020902A at Load CodeObjectSql, CodeObjectSql File [1]: The "output column "Guid" (10)" failed because truncation occurred, and the truncation row disposition on "output column "Guid" (10)" specifies failure on truncation. A truncation error occurred on the specified object of the specified component.
Error: 0xC0202092 at Load CodeObjectSql, CodeObjectSql File [1]: An error occurred while processing file "C:\CodeObjectSql.csv" on data row 2.
Error: 0xC0047038 at Load CodeObjectSql, SSIS.Pipeline: SSIS Error Code DTS_E_PRIMEOUTPUTFAILED. The PrimeOutput method on component "CodeObjectSql File" (1) returned error code 0xC0202092. The component returned a failure code when the pipeline engine called PrimeOutput(). The meaning of the failure code is defined by the component, but the error is fatal and the pipeline stopped executing. There may be error messages posted before this with more information about the failure.
然后我尝试将文件更改为 Unicode 并将列类型修改为它们的 unicode 等效项
Guid: string [DT_WSTR] 36
Sql: text stream [DT_NTEXT]
仍然没有运气。
我的经验是,SSIS 无法处理数据中出现的行或列分隔符字符,方法是使用文本限定符字符并将文本值中的特殊字符加倍以表示数据中的一次出现。
如果根据我的测试,我的假设都是正确的,那么用于这种类型数据的最佳格式是什么?
尝试创建此表并将数据粘贴到输入文件中并亲自查看。:-)