2017-04-06 43 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