這裏的問題是: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