2017-02-23 4 views
0

私の問題は、XMLから属性名と文字データを取得する必要があることです。 SSISはXSDを生成しますが、出力は私が期待したものではありません。このXMLから文字データを取得することは可能ですか、またはXMLをスクリプトタスクを通じてフィールドにロードするだけでよいのでしょうか。最終的には、データをテーブル形式で取得する必要があります。SSIS 2005 XMLからデータベース

私はこのXMLを持っています。

私は私の出力をする必要が

ID, 
ExtID, 
Status, 
Type, 
Title, 

...であるXMLソースを通してそれに接続され、フラットファイルにXSD

<?xml version="1.0"?> 
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="GeneralActivity"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="unbounded" name="Field"> 
      <xs:complexType> 
      <xs:simpleContent> 
       <xs:extension base="xs:string"> 
       <xs:attribute name="APIName" type="xs:string" use="optional" /> 
       </xs:extension> 
      </xs:simpleContent> 
      </xs:complexType> 
     </xs:element> 
     </xs:sequence> 
     <xs:attribute name="CustomizedType" type="xs:string" use="optional" /> 
    </xs:complexType> 
    </xs:element> 
</xs:schema> 

私の出力を生成し

<GeneralActivity CustomizedType="Visit"> 
<Field APIName="ID">32211465</Field> 
<Field APIName="ExID">999</Field> 
<Field APIName="Status">Submited</Field> 
<Field APIName="Type">Visit</Field> 
<Field APIName="Title">Test Title</FIeld> 
</GeneralActivity> 

。 ..

ID,32211465 
ExtID,999 
Status,Submited 
Type,Visit 
Title,Test Title 
+0

ファイルをテーブルに読み込んだ後、クエリを実行しますか? – manderson

+0

2005年は私が必要とすることができないと言うのは安全でしょうか?私はそれが2008年にここで行われているのを見ます。 http://blog.hoegaerden.be/2011/04/07/loading-xml-using-ssis/ – manderson

答えて

0

私はこのことがわかりません最も効率的な方法は、自由にコメントすることができます。 これは私のために今働くものです。私が行くように調整しなければならないと確信しています。

私は、ピックアップする必要があるXMLファイルをループするSSISパッケージを作成しました。 1つずつ、私は2つのストアドプロシージャを呼び出します。

最初に、このリソースを使用して作成しました。 SQL 2005 XML Import

ALTER PROCEDURE ithc_InsertVisits 
    -- Add the parameters for the stored procedure here 
    @fileName AS NVARCHAR(MAX) 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    EXEC(' 
      INSERT INTO ithc_VisitsXML(xmlFileName, xmldata, xmlStatus) 

      SELECT ''' + @fileName + ''', xmlData, 0 
      FROM 
      (
       SELECT * 
       FROM OPENROWSET (BULK ''' + @fileName + ''' , SINGLE_BLOB) AS XMLDATA 
      ) AS FileImport (XMLDATA) 
     ') 

END 
GO 

これは私にこれらの結果をもたらします。 enter image description here

次に、テーブル形式でデータを取得するために次のストアプロシージャが呼び出されます。このテーブルには、すべてのXML属性がnvarchar(max)として格納されています。

CREATE PROCEDURE ithc_InsertVisitsPopulate 
    -- Add the parameters for the stored procedure here 
AS 
BEGIN 

-- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    DECLARE @loopCount   INT 
    DECLARE @recordID   INT 
    DECLARE @columnName   NVARCHAR(128) 
    DECLARE @dataType   NVARCHAR(10) 
    DECLARE @strSQL    NVARCHAR(MAX) 

    DECLARE @fieldValue   NVARCHAR(MAX) 

    --Create a record in Visits so that we can update that record 
    INSERT INTO ithc_Visits(xmlid) 
    SELECT id FROM ithc_VisitsXML WHERE xmlstatus = 0 

    CREATE TABLE #TableFields 
    (
     id int not null identity, 
     COLUMN_NAME NVARCHAR(100), 
     DATA_TYPE NVARCHAR(10) 
    ) 

    --Insert Tasks to temp table 
    INSERT INTO #TableFields (COLUMN_NAME, DATA_TYPE) 
    SELECT COLUMN_NAME, DATA_TYPE 
    FROM Information_Schema.Columns 
    WHERE Table_Name = 'ithc_Visits' 
      AND COLUMN_NAME <> 'ID' 
-- ORDER BY COLUMN_NAME 

    CREATE TABLE #temptable 
    (
     id INT IDENTITY(1,1), 
     fieldName VARCHAR(100), 
     fieldValue VARCHAR(100), 
     xmlID BIGINT 
    ) 

    INSERT INTO #temptable(fieldName, fieldValue, xmlID) 
    SELECT r.value('@APIName', 'nvarchar(100)') AS Field1 
      , r.value('.', 'nvarchar(100)') AS Field2 
      , id 
    FROM ithc_VisitsXML 
     CROSS APPLY xmlData.nodes('/GeneralActivity/Field') AS x(r) 
    WHERE xmlstatus = 0 

    --Set a loopCount for while loop 
    SET @loopCount = 1 

    --Use the while loop to check if we have any fields left to go through 
     while (exists(SELECT id FROM #TableFields WHERE id = @loopCount)) 
      BEGIN 

       --Get current record in temp table 
       SELECT @columnName  = t.COLUMN_NAME, 
         @dataType  = t.DATA_TYPE, 
         @fieldValue  = v.fieldValue, 
         @recordID  = v.xmlID 
       FROM #TableFields t 
        JOIN #temptable v ON 
         t.id = v.id AND 
         t.COLUMN_NAME = v.fieldName 
       WHERE t.id = @loopCount 
       -----------------------------------------------------------   

       SET @strSQL = 'UPDATE ithc_Visits SET ' + @columnName + ' = ''' + CONVERT(NVARCHAR(MAX), @fieldValue) + ''' FROM ithc_Visits WHERE ID = ' + CONVERT(NVARCHAR(MAX), @recordID) 
       EXEC sp_executesql @strSQL, N'@columnName varchar(128)', @columnName = @columnName 


       DELETE FROM #TableFields WHERE id = @loopCount 

       SET @loopCount = @loopCount + 1 
      END 

    UPDATE ithc_VisitsXML 
    SET xmlStatus = 1 
    WHERE id = @recordID 

    DROP TABLE #TableFields 
    DROP TABLE #temptable 
END 
GO 

これは私にこれらの結果をもたらします。 (サンプルセット) enter image description here

関連する問題