2017-04-06 42 views
0

这里的问题是:SSIS,与XSD文件的XML源...和nvarchar(最大)目标列

  • 我已经交给一个SSIS包来更新它使用的XML源读取数据XML文件并将其内容读取到多个表中。
  • XML Source具有指向外部.xsd文件的XMLSchemaDefinition属性。随着相关数据源规范的发展,此.xsd文件可能会收到更新。
  • 其中一个目标表中的一列是nvarchar(max)。

在XML Source的高级编辑器>输入和输出属性中,我可以手动将此元素的DataType属性设置为Unicode text stream [DT_NTEXT]并获得正确的转换行为。但是,下次有人进入此屏幕并单击Refresh按钮时,我的更改将被撤消,事情将开始打破。

当我第一次给这个包到的.xsd元素上工作过的定义:

<xs:attribute name="SomeLongText" type="xs:string" use="optional" /> 

这导致Unicode string [DT_WSTR]一个数据类型和长度255,255是默认值。

SSIS也响应简单类型定义,例如:

<xs:simpleType name="string100"> 
    <xs:restriction base="xs:string"> 
     <xs:maxLength value="100" /> 
    </xs:restriction> 
    </xs:simpleType> 
    <!-- ... --> 
    <xs:attribute name="SomeLongText" type="string100" use="optional" /> 

这导致Unicode string [DT_WSTR]与长100预期。现在

Integration Services Data Types有这样说关于DT_NTEXT数据类型:

DT_NTEXT Unicode字符串的2^30的最大长度 - 1 (1073741823)字符。

1,073,741,823听起来像,所以如果我定义与限制的简单类型在这里使用一个良好的,相应的数字:

<xs:simpleType name="stringMax"> 
    <xs:restriction base="xs:string"> 
     <xs:maxLength value="1073741823" /> 
    </xs:restriction> 
    </xs:simpleType> 
    <!-- ... --> 
    <xs:attribute name="SomeLongText" type="stringMax" use="optional" /> 

在SSIS中,我得到的Unicode string [DT_WSTR]的数据类型与长度4000,这似乎是DT_WSTR的最大限制。

如果我利用知识sys.columns报告为nvarchar(最大)列,长度为-1,试试这个来代替:

<xs:simpleType name="stringMax"> 
    <xs:restriction base="xs:string"> 
     <xs:maxLength value="-1" /> 
    </xs:restriction> 
    </xs:simpleType> 
    <!-- ... --> 
    <xs:attribute name="SomeLongText" type="stringMax" use="optional" /> 

我得到SSIS以下错误消息点击Refresh

时数据流任务错误[XML Source [229]]:在映射上设置了一个错误 。 MaxLength约束方面无效 - 对于NonNegativeInteger,值 '-1'对于太大或太小都是无效的。

我想,那就排除-1。

所以,我的问题是:我需要在.xsd文件中放置什么魔术来哄骗XML Source将源元素视为Unicode text stream [DT_NTEXT]

我想这是与Refresh按钮向前发展,使得具有处理此问题(可能我)不破的东西在未来穷笨蛋兼容。

感谢和亲切的问候, 蚂蚁。

+0

一种方法可能是将一个unicode字符串作为字节数组发送,并将其读为'VARBINARY(MAX)',可将其重新转换为像'CAST(YourByteStream AS NVARCHAR(MAX))'这样的字符串。我想,在这种情况下,你没有任何限制。在我的大脑的最后角落里有这个想法,你可以通过整个事情''像所有

文本

'XML'。字符串是有限的,XML和BLOB不是。但是 - 说实话 - 我没有SSIS的经验。 – Shnugo

+0

@Shnugo:感谢您的反馈。特定的来源列基本上是一段文字。具体地说,它的科学数据的人输入的评价,也许含有科学符号和其他非ASCII字符(因此需要对Unicode),并在箱子约1%其长度将超过4000个字符(因此使得DT_WSTR 4000不适合)。由于DT_WSTR数据类型的限制,数据可能已经被截断,所以在XML源之后应用转换将不会有帮助。 – AlwaysLearning

回答

0

嗯,这是SSIS的PITA,它使用标准的XML源代码。
你必须手动设置输出列的DT_NTEXT数据类型高级编辑器走,任何人都可以打刷新和破坏你的工作的风险。标准XML源将静默更新输出定义,因此每次使用此软件包构建项目时都必须仔细检查。
选择 - 你可以尝试像ZappySysBlueSSIS商业SSIS XML源组件。我没有任何经验,所以不能推荐。

+0

不幸的是,这似乎是这种情况。经过几天的研究,我已经放弃了,并在Data Flow表上放了一大堆WARNING注释,调用XML Source节点的恶意行为。 – AlwaysLearning