这里的问题是: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
按钮向前发展,使得具有处理此问题(可能我)不破的东西在未来穷笨蛋兼容。
感谢和亲切的问候, 蚂蚁。
一种方法可能是将一个unicode字符串作为字节数组发送,并将其读为'VARBINARY(MAX)',可将其重新转换为像'CAST(YourByteStream AS NVARCHAR(MAX))'这样的字符串。我想,在这种情况下,你没有任何限制。在我的大脑的最后角落里有这个想法,你可以通过整个事情''像所有
文本
'XML'。字符串是有限的,XML和BLOB不是。但是 - 说实话 - 我没有SSIS的经验。 – Shnugo@Shnugo:感谢您的反馈。特定的来源列基本上是一段文字。具体地说,它的科学数据的人输入的评价,也许含有科学符号和其他非ASCII字符(因此需要对Unicode),并在箱子约1%其长度将超过4000个字符(因此使得DT_WSTR 4000不适合)。由于DT_WSTR数据类型的限制,数据可能已经被截断,所以在XML源之后应用转换将不会有帮助。 – AlwaysLearning