2017-02-23 75 views
0

我的问题是,我需要从XML中获取属性名称和字符数据。 SSIS生成XSD,但输出结果并不符合我的预期。是否可以从这个XML获取字符数据,或者是否应该通过脚本任务将XML加载到字段中。我最终必须以表格格式获取数据。SSIS 2005 XML到数据库

我有这个XML。

<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> 

我通过一个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> 

我输出到一个平面文件是...

ID, 
ExtID, 
Status, 
Type, 
Title, 

我需要输出为。 ..

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

我不知道这是不是最有效的方式,随时发表评论。 这对我来说很有用。我相信我必须随时调整。

我创建了一个SSIS包,它循环访问需要拾取的XML文件。一次一个,我打电话给两个存储过程。

第一个,我用这个资源创建的。 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

然后调用下一个存储过程以获取表格格式的数据。该表具有存储为nvarchar(max)的所有XML属性。

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