【问题标题】:SSIS SQL char conversion to MS Access Yes/No fieldSSIS SQL char 转换为 MS Access 是/否字段
【发布时间】:2009-06-17 20:48:01
【问题描述】:

我正在开发一个 SSIS 包。我正在尝试将数据从 SQL Server 2005 写入 MS Access 2007。

我很困惑如何将 SQL char(1) 字段转换为 Access Yes/No 字段。

根据我收集的信息,Access Yes/No 字段的 SQL 等效项将是一个位字段,其值为 0 或 1。

我的 SQL char(1) 字段(这是我的源字段),包含“N”或“Y”。我没有使用位字段的选项,因此我进退两难。我尝试过转换为布尔值和整数,但没有成功。

在我的数据流任务中,我尝试创建正则表达式无济于事,派生列、数据转换等也无济于事。我被卡住了。

我已经看到了一些关于构建循环遍历 .Row 集合的条件语句的示例。这似乎有点过分,必须为 NULL 检查或字符串值编写条件。

在 MSDN 链接 SSIS Equivalent to DTS Transform Data Task Properties ...它有一些类似于此的代码:

If DTSSource("Col010") = "Y" Then
  DTSDestination("X") =  -1
 Else
  DTSDestination("X") =  0
End If

我应该能够通过代码直接操作行值吗?由于源字段是 Yes/No 类型,它是否接受整数值?负值?是的实际上是 MS 访问中的“-1”,我想这让我感到困惑。

似乎正则表达式可以解决这个问题,但我也不确定如何使用它。

有什么我忽略的吗?必须有一种方法可以将“CHAR”转换为“YES/NO”。

** 我知道在这里很容易指出,好的 ol' 2000 SQL DTS 可以毫无问题地处理这个问题,默认情况下,开箱即用,由猴子安装。我发现自己在 SSIS 的非常小的怪癖上花费了太多时间,例如这个是/否字段问题。

我找不到关于 SSIS 和 MS Access Yes/No 字段的任何文档。 MSDN 也不允许我发布问题。我知道,可怜的我:(

有没有人在使用 SSIS 和 MS Access 时遇到过这种怪癖?

【问题讨论】:

  • Access 没有字段,因为它不是数据库。另一方面,Jet 是一个数据库,它确实有字段和自己的数据类型。
  • 感谢您提供开创性的高科技建议。给自己买一个芝士汉堡给我。

标签: ssis char ms-access-2007


【解决方案1】:

有关派生列转换的信息,请参阅 MSDN 上的 this topic

它并没有具体说明您想要做什么,但一些示例暗示您应该能够实现您的目标。将派生输出列的类型设置为 DT_BOOL 并使用上面代码的单行版本作为表达式(可能使用三元运算符?)。

是的,Access Jet 将 True 表示为 -1。假 = 0,真不假。如果将按位 Not 应用于 0,则会得到 -1 的二进制补码版本。

更新: Jet 内部存储的布尔值 为整数(看图——但这就是他们选择的......)。因此,Jet Yes/No 字段接受零 (0) 表示 False,非零(不仅仅是 -1)表示 True。 查看评论

【讨论】:

  • 您的意思是 Jet 将 True 表示为 -1,将 False 表示为 0。Access 没有数据类型(尽管 VBA 有)。
  • @David W. Fenton:你是对的,我错了,每个人都讨厌我,我想我会回去吃蠕虫......真的,谢谢你的澄清 - -方式太容易误以为它们是相同的,尤其是当我已经离开它们一段时间时。
  • @Devtron:David W. Fenton 的世界观牢牢地停留在 1990 年代中期的 Jet 3.51 Access95 时代。如今,Microsoft 将旧的 Jet 引擎和新的 ACE 引擎(其中“A”代表“Access”)统称为“Access 数据库引擎”,例如请参阅office.microsoft.com/en-us/access/HA012337221033.aspx,您不会在该页面上找到“Jet”这个词,因为 a)理论上“Jet”是一个已弃用的术语,b)在物理上旧的 Jet 引擎不支持新的多值数据类型,只有新的 ACE 可以。另外还有超链接数据类型,仅适用于 Access UI。
  • Access 数据库引擎的 YESNO 数据类型不是布尔值。与所有 SQL 数据类型一样,它是 NULLable 并表现出三值逻辑。这不是布尔值!
  • ...但不同的是,Access 数据库引擎缺少处理此问题的表达式;相反,它使用布尔逻辑并且不正确地将 NULL 值强制为假......有时。这种不一致导致我(和其他人:请参阅allenbrowne.com/NoYesNo.html)建议避免使用 YESNO 数据类型。我也会使用 INTEGER 但对允许的值有 CHECK 约束。
【解决方案2】:

为了解决这个问题,我创建了一个派生列。

该列的正则表达式为:

[column] == "Y" ? -1 : 0

数据类型是:

single-byte signed integer [DT_I1]

还有中提琴! Jet(又名 MS Access,感谢 David W. Fenton!)现在显示我的“是/否”字段。

在注意到表格中只出现一条记录后,我注意到我的测试数据无效并纠正了根本问题。

这是关于如何将 SQL char(1) 字段(带有“N”或“Y”值)转换为 MS Access(oooops,我的意思是 Jet)Yes/No 字段的很好的文档。

感谢大家的帮助。 Stackoverflow 是无价的。

【讨论】:

    猜你喜欢
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多