从SQL数据创建XML

从SQL数据创建XML,sql,xml,sql-server-2008,ssis,Sql,Xml,Sql Server 2008,Ssis,我有一个巨大的XML,有150多个元素和属性。我只需要用SQLServer2008表中的数据填充其中的少数5或6个元素。这个创建的xml需要传递给一个webservice到ESB,并且这必须按每日计划进行 我认为,在这里使用XML路径来创建XML和使用SSI是没有意义的。有人能建议一种方法吗 这是示例XML。我只需要姓名、地址和几个ID <?xml version="1.0" encoding="UTF-8"?> <Customer xmlns:xsi="http://www.

我有一个巨大的XML,有150多个元素和属性。我只需要用SQLServer2008表中的数据填充其中的少数5或6个元素。这个创建的xml需要传递给一个webservice到ESB,并且这必须按每日计划进行

我认为,在这里使用XML路径来创建XML和使用SSI是没有意义的。有人能建议一种方法吗

这是示例XML。我只需要姓名、地址和几个ID

<?xml version="1.0" encoding="UTF-8"?>
<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Customer.xsd">
<CustomerData>
        <StoreID></StoreID>
        <FirstName></FirstName>
        <LastName></LastName>
        <Gender></Gender>
        <BirthMonth></BirthMonth>
        <BirthYear></BirthYear>
        <BirthDay></BirthDay>
        <IsEmployee></IsEmployee>
        <customerID></customerID>
        <EmailAddress></EmailAddress>
        <PhoneNumber></PhoneNumber>
        <EmailSignUp></EmailSignUp>
        <CatalogSignup></CatalogSignup>
        <Addresses>
            <BillingAddress>
                <Address1></Address1>
                <Address2></Address2>
                <Address3></Address3>
                <City></City>
                <State></State>
                <ZipCode></ZipCode>
                <Fax1></Fax1>
            </BillingAddress>
            <CatalogSignupAddress>
                <Address1></Address1>
                <Address2></Address2>
                <Address3></Address3>
                <City></City>
                <State></State>
                <ZipCode></ZipCode>
                <Fax1></Fax1>
            </CatalogSignupAddress>
            <StoredAddresses>
                <StoredAddress>
                    <Address1></Address1>
                    <Address2></Address2>
                    <Address3></Address3>
                    <City></City>
                    <State></State>
                    <ZipCode></ZipCode>
                    <Fax1></Fax1>
                </StoredAddress>
                <StoredAddress>
                    <Address1></Address1>
                    <Address2></Address2>
                    <Address3></Address3>
                    <City></City>
                    <State></State>
                    <ZipCode></ZipCode>
                    <Fax1></Fax1>
                </StoredAddress>
            </StoredAddresses>
        </Addresses>
        <Hobbies_Enjoys>
            <Hobby></Hobby>
            <Enjoy></Enjoy>
        </Hobbies_Enjoys>
        <FavoriteFossilProducts>
            <ProductType></ProductType>
            <ProductType></ProductType>
        </FavoriteFossilProducts>
        <AgeRange></AgeRange>
        <PreferredEmailFormat></PreferredEmailFormat>
        <SavedCreditCards>
            <CreditCard>
                <AcctNum></AcctNum>
                <ExpiryDate></ExpiryDate>
            </CreditCard>
            <CreditCard>
                <AcctNum></AcctNum>
                <ExpiryDate></ExpiryDate>
            </CreditCard>
        </SavedCreditCards>
        <PurchasedProductList>
            <SKU></SKU>
            <SKU></SKU>
        </PurchasedProductList>
        <OrderHistory>
            <Orders>
                <Order>
                    <Number></Number>
                    <TotalAmount></TotalAmount>
                    <Promotion></Promotion>
                    <TimePlaced></TimePlaced>
                </Order>
                <Order>
                    <Number></Number>
                    <TotalAmount></TotalAmount>
                    <Promotion></Promotion>
                    <TimePlaced></TimePlaced>
                </Order>
            </Orders>
        </OrderHistory>
        <WishLists>
            <WishList>
                <Name></Name>
                <Description></Description>
                <DateCreated></DateCreated>
                <LastUpdate></LastUpdate>
                <IsDefault></IsDefault>
                <Items>
                    <Item>
                        <Quantity></Quantity>
                        <PartNumber></PartNumber>
                        <DateCreated></DateCreated>
                        <LastUpdate></LastUpdate>
                    </Item>
                    <Item>
                        <Quantity></Quantity>
                        <PartNumber></PartNumber>
                        <DateCreated></DateCreated>
                        <LastUpdate></LastUpdate>
                    </Item>
                </Items>
            </WishList>
            <WishList>
                <Name></Name>
                <Description></Description>
                <DateCreated></DateCreated>
                <LastUpdate></LastUpdate>
                <IsDefault></IsDefault>
                <Items>
                    <Item>
                        <Quantity></Quantity>
                        <PartNumber></PartNumber>
                        <DateCreated></DateCreated>
                        <LastUpdate></LastUpdate>
                    </Item>
                    <Item>
                        <Quantity></Quantity>
                        <PartNumber></PartNumber>
                        <DateCreated></DateCreated>
                        <LastUpdate></LastUpdate>
                    </Item>
                </Items>
            </WishList>
        </WishLists>
    </CustomerData>
    <CustomerData>
    </CustomerData>
</Customer>

一种方法是获取XML文档的空版本并将其分配给NVARCHARMAX变量。对于要填充的每个节点或参数,放置一个标记并使用replace函数填充值。例如:

DECLARE @xml NVARCHAR(MAX)

SET @xml = N'<Company name="~company_name~">
<Department name="~dept_name~">
<Employee name="~employee_name~" title="~employee_title~" />
</Department>
</Company>'

SET @xml = REPLACE(@xml,N'~company_name~','Microsoft')
SET @xml = REPLACE(@xml,N'~dept_name~','Executive')
SET @xml = REPLACE(@xml,N'~employee_name~','Satya Nadella')
SET @xml = REPLACE(@xml,N'~employee_title~','CEO')

SELECT CAST(@xml AS XML)
这里有一个更传统的方法。要更新的单元格中需要一个任意值:

DECLARE @example_data TABLE 
(FirstName VARCHAR(255) NOT NULL,
LastName VARCHAR(255) NOT NULL,
Gender CHAR(1) NOT NULL,
City VARCHAR(255) NOT NULL,
[State] CHAR(2) NOT NULL)

INSERT INTO @example_data
        ( FirstName , LastName , Gender , City , [State])
VALUES  ( 'Satya' , -- FirstName - varchar(255)
          'Nadella' , -- LastName - varchar(255)
          'M' , -- Gender - char(1)
          'Redmond' , -- City - varchar(255)
          'WA'  -- State - char(2)
        )
INSERT INTO @example_data
        ( FirstName , LastName , Gender , City , [State])
VALUES  ( 'Larry' , -- FirstName - varchar(255)
          'Ellison' , -- LastName - varchar(255)
          'M' , -- Gender - char(1)
          'Woodside' , -- City - varchar(255)
          'CA'  -- State - char(2)
        )


DECLARE 
@customer_xml XML,
@xml XML,
@temp NVARCHAR(255),
@FirstName VARCHAR(255),
@LastName  VARCHAR(255),
@Gender CHAR(1),
@City VARCHAR(255),
@State CHAR(2)

SET @customer_xml = '<?xml version="1.0" encoding="UTF-8"?>
<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Customer.xsd">
<CustomerData>
        <StoreID></StoreID>
        <FirstName>a</FirstName>
        <LastName>b</LastName>
        <Gender>c</Gender>
        <BirthMonth></BirthMonth>
        <BirthYear></BirthYear>
        <BirthDay></BirthDay>
        <IsEmployee></IsEmployee>
        <customerID></customerID>
        <EmailAddress></EmailAddress>
        <PhoneNumber></PhoneNumber>
        <EmailSignUp></EmailSignUp>
        <CatalogSignup></CatalogSignup>
        <Addresses>
            <BillingAddress>
                <Address1></Address1>
                <Address2></Address2>
                <Address3></Address3>
                <City>d</City>
                <State>e</State>
                <ZipCode></ZipCode>
                <Fax1></Fax1>
            </BillingAddress>
            <CatalogSignupAddress>
                <Address1></Address1>
                <Address2></Address2>
                <Address3></Address3>
                <City></City>
                <State></State>
                <ZipCode></ZipCode>
                <Fax1></Fax1>
            </CatalogSignupAddress>
            <StoredAddresses>
                <StoredAddress>
                    <Address1></Address1>
                    <Address2></Address2>
                    <Address3></Address3>
                    <City></City>
                    <State></State>
                    <ZipCode></ZipCode>
                    <Fax1></Fax1>
                </StoredAddress>
                <StoredAddress>
                    <Address1></Address1>
                    <Address2></Address2>
                    <Address3></Address3>
                    <City></City>
                    <State></State>
                    <ZipCode></ZipCode>
                    <Fax1></Fax1>
                </StoredAddress>
            </StoredAddresses>
        </Addresses>
        <Hobbies_Enjoys>
            <Hobby></Hobby>
            <Enjoy></Enjoy>
        </Hobbies_Enjoys>
        <FavoriteFossilProducts>
            <ProductType></ProductType>
            <ProductType></ProductType>
        </FavoriteFossilProducts>
        <AgeRange></AgeRange>
        <PreferredEmailFormat></PreferredEmailFormat>
        <SavedCreditCards>
            <CreditCard>
                <AcctNum></AcctNum>
                <ExpiryDate></ExpiryDate>
            </CreditCard>
            <CreditCard>
                <AcctNum></AcctNum>
                <ExpiryDate></ExpiryDate>
            </CreditCard>
        </SavedCreditCards>
        <PurchasedProductList>
            <SKU></SKU>
            <SKU></SKU>
        </PurchasedProductList>
        <OrderHistory>
            <Orders>
                <Order>
                    <Number></Number>
                    <TotalAmount></TotalAmount>
                    <Promotion></Promotion>
                    <TimePlaced></TimePlaced>
                </Order>
                <Order>
                    <Number></Number>
                    <TotalAmount></TotalAmount>
                    <Promotion></Promotion>
                    <TimePlaced></TimePlaced>
                </Order>
            </Orders>
        </OrderHistory>
        <WishLists>
            <WishList>
                <Name></Name>
                <Description></Description>
                <DateCreated></DateCreated>
                <LastUpdate></LastUpdate>
                <IsDefault></IsDefault>
                <Items>
                    <Item>
                        <Quantity></Quantity>
                        <PartNumber></PartNumber>
                        <DateCreated></DateCreated>
                        <LastUpdate></LastUpdate>
                    </Item>
                    <Item>
                        <Quantity></Quantity>
                        <PartNumber></PartNumber>
                        <DateCreated></DateCreated>
                        <LastUpdate></LastUpdate>
                    </Item>
                </Items>
            </WishList>
            <WishList>
                <Name></Name>
                <Description></Description>
                <DateCreated></DateCreated>
                <LastUpdate></LastUpdate>
                <IsDefault></IsDefault>
                <Items>
                    <Item>
                        <Quantity></Quantity>
                        <PartNumber></PartNumber>
                        <DateCreated></DateCreated>
                        <LastUpdate></LastUpdate>
                    </Item>
                    <Item>
                        <Quantity></Quantity>
                        <PartNumber></PartNumber>
                        <DateCreated></DateCreated>
                        <LastUpdate></LastUpdate>
                    </Item>
                </Items>
            </WishList>
        </WishLists>
    </CustomerData>
</Customer>'

DECLARE xml_cursor CURSOR FOR
SELECT FirstName , LastName , Gender , City , [State]
FROM @example_data

OPEN xml_cursor 

FETCH NEXT FROM xml_cursor into @FirstName, @LastName, @Gender, @City, @State

WHILE @@fetch_status = 0
BEGIN
    SET @xml = @customer_xml

    SET @xml.modify('
    replace value of (/Customer/CustomerData/FirstName[1]/text())[1]
    with sql:variable("@FirstName")
  ')

    SET @xml.modify('
    replace value of (/Customer/CustomerData/LastName[1]/text())[1]
    with sql:variable("@LastName")
  ')

    SET @xml.modify('
    replace value of (/Customer/CustomerData/Gender[1]/text())[1]
    with sql:variable("@Gender")
  ')

    SET @xml.modify('
    replace value of (/Customer/CustomerData/Addresses/BillingAddress/City[1]/text())[1]
    with sql:variable("@City")
  ')

    SET @xml.modify('
    replace value of (/Customer/CustomerData/Addresses/BillingAddress/State[1]/text())[1]
    with sql:variable("@State")
  ')


    select @xml

    FETCH NEXT FROM xml_cursor into @FirstName, @LastName, @Gender, @City, @State
END
这种方法不需要更新节点中的值。它只需插入一个新节点,然后删除旧节点:

DECLARE @example_data TABLE 
(FirstName VARCHAR(255) NOT NULL,
LastName VARCHAR(255) NOT NULL,
Gender CHAR(1) NOT NULL,
City VARCHAR(255) NOT NULL,
[State] CHAR(2) NOT NULL)

INSERT INTO @example_data
        ( FirstName , LastName , Gender , City , [State])
VALUES  ( 'Satya' , -- FirstName - varchar(255)
          'Nadella' , -- LastName - varchar(255)
          'M' , -- Gender - char(1)
          'Redmond' , -- City - varchar(255)
          'WA'  -- State - char(2)
        )
INSERT INTO @example_data
        ( FirstName , LastName , Gender , City , [State])
VALUES  ( 'Larry' , -- FirstName - varchar(255)
          'Ellison' , -- LastName - varchar(255)
          'M' , -- Gender - char(1)
          'Woodside' , -- City - varchar(255)
          'CA'  -- State - char(2)
        )


DECLARE 
@customer_xml XML,
@xml XML,
@temp NVARCHAR(255),
@FirstName VARCHAR(255),
@LastName  VARCHAR(255),
@Gender CHAR(1),
@City VARCHAR(255),
@State CHAR(2)

SET @customer_xml = '<?xml version="1.0" encoding="UTF-8"?>
<Customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Customer.xsd">
<CustomerData>
        <StoreID></StoreID>
        <FirstName></FirstName>
        <LastName></LastName>
        <Gender></Gender>
        <BirthMonth></BirthMonth>
        <BirthYear></BirthYear>
        <BirthDay></BirthDay>
        <IsEmployee></IsEmployee>
        <customerID></customerID>
        <EmailAddress></EmailAddress>
        <PhoneNumber></PhoneNumber>
        <EmailSignUp></EmailSignUp>
        <CatalogSignup></CatalogSignup>
        <Addresses>
            <BillingAddress>
                <Address1></Address1>
                <Address2></Address2>
                <Address3></Address3>
                <City></City>
                <State></State>
                <ZipCode></ZipCode>
                <Fax1></Fax1>
            </BillingAddress>
            <CatalogSignupAddress>
                <Address1></Address1>
                <Address2></Address2>
                <Address3></Address3>
                <City></City>
                <State></State>
                <ZipCode></ZipCode>
                <Fax1></Fax1>
            </CatalogSignupAddress>
            <StoredAddresses>
                <StoredAddress>
                    <Address1></Address1>
                    <Address2></Address2>
                    <Address3></Address3>
                    <City></City>
                    <State></State>
                    <ZipCode></ZipCode>
                    <Fax1></Fax1>
                </StoredAddress>
                <StoredAddress>
                    <Address1></Address1>
                    <Address2></Address2>
                    <Address3></Address3>
                    <City></City>
                    <State></State>
                    <ZipCode></ZipCode>
                    <Fax1></Fax1>
                </StoredAddress>
            </StoredAddresses>
        </Addresses>
        <Hobbies_Enjoys>
            <Hobby></Hobby>
            <Enjoy></Enjoy>
        </Hobbies_Enjoys>
        <FavoriteFossilProducts>
            <ProductType></ProductType>
            <ProductType></ProductType>
        </FavoriteFossilProducts>
        <AgeRange></AgeRange>
        <PreferredEmailFormat></PreferredEmailFormat>
        <SavedCreditCards>
            <CreditCard>
                <AcctNum></AcctNum>
                <ExpiryDate></ExpiryDate>
            </CreditCard>
            <CreditCard>
                <AcctNum></AcctNum>
                <ExpiryDate></ExpiryDate>
            </CreditCard>
        </SavedCreditCards>
        <PurchasedProductList>
            <SKU></SKU>
            <SKU></SKU>
        </PurchasedProductList>
        <OrderHistory>
            <Orders>
                <Order>
                    <Number></Number>
                    <TotalAmount></TotalAmount>
                    <Promotion></Promotion>
                    <TimePlaced></TimePlaced>
                </Order>
                <Order>
                    <Number></Number>
                    <TotalAmount></TotalAmount>
                    <Promotion></Promotion>
                    <TimePlaced></TimePlaced>
                </Order>
            </Orders>
        </OrderHistory>
        <WishLists>
            <WishList>
                <Name></Name>
                <Description></Description>
                <DateCreated></DateCreated>
                <LastUpdate></LastUpdate>
                <IsDefault></IsDefault>
                <Items>
                    <Item>
                        <Quantity></Quantity>
                        <PartNumber></PartNumber>
                        <DateCreated></DateCreated>
                        <LastUpdate></LastUpdate>
                    </Item>
                    <Item>
                        <Quantity></Quantity>
                        <PartNumber></PartNumber>
                        <DateCreated></DateCreated>
                        <LastUpdate></LastUpdate>
                    </Item>
                </Items>
            </WishList>
            <WishList>
                <Name></Name>
                <Description></Description>
                <DateCreated></DateCreated>
                <LastUpdate></LastUpdate>
                <IsDefault></IsDefault>
                <Items>
                    <Item>
                        <Quantity></Quantity>
                        <PartNumber></PartNumber>
                        <DateCreated></DateCreated>
                        <LastUpdate></LastUpdate>
                    </Item>
                    <Item>
                        <Quantity></Quantity>
                        <PartNumber></PartNumber>
                        <DateCreated></DateCreated>
                        <LastUpdate></LastUpdate>
                    </Item>
                </Items>
            </WishList>
        </WishLists>
    </CustomerData>
</Customer>'

DECLARE xml_cursor CURSOR FOR
SELECT FirstName , LastName , Gender , City , [State]
FROM @example_data

OPEN xml_cursor 

FETCH NEXT FROM xml_cursor into @FirstName, @LastName, @Gender, @City, @State

WHILE @@fetch_status = 0
BEGIN
    SET @xml = @customer_xml

    SET @xml.modify('
    insert <FirstName>{ xs:string(sql:variable("@FirstName")) }</FirstName>          
    before (/Customer/CustomerData/FirstName)[1]
    ')

    SET @xml.modify('
    delete /Customer/CustomerData/FirstName[2]
    ')

    SET @xml.modify('
    insert <LastName>{ xs:string(sql:variable("@LastName")) }</LastName>          
    before (/Customer/CustomerData/LastName)[1]
    ')

    SET @xml.modify('
    delete /Customer/CustomerData/LastName[2]
    ')

    SET @xml.modify('
    insert <Gender>{ xs:string(sql:variable("@Gender")) }</Gender>          
    before (/Customer/CustomerData/Gender)[1]
    ')

    SET @xml.modify('
    delete /Customer/CustomerData/Gender[2]
    ')

    SET @xml.modify('
    insert <City>{ xs:string(sql:variable("@City")) }</City>          
    before (/Customer/CustomerData/Addresses/BillingAddress/City)[1]
    ')

    SET @xml.modify('
    delete /Customer/CustomerData/Addresses/BillingAddress/City[2]
    ')

    SET @xml.modify('
    insert <State>{ xs:string(sql:variable("@State")) }</State>          
    before (/Customer/CustomerData/Addresses/BillingAddress/State)[1]
    ')

    SET @xml.modify('
    delete /Customer/CustomerData/Addresses/BillingAddress/State[2]
    ')

    select @xml

    FETCH NEXT FROM xml_cursor into @FirstName, @LastName, @Gender, @City, @State
END

您还可以使用FLWOR,它将允许您通过使用模板和仅向所需元素添加数据一次生成xml。 您不需要创建表或存储过程。例如:

declare @x xml
set @x=(select FirstName, LastName from kc_consumer for xml path('CustomerData'))

SELECT @x.query('
for $a in /CustomerData
  return 
<CustomerData>
<StoreID></StoreID>

<FirstName>{data($a/FirstName)}</FirstName>
<LastName>{data($a/LastName)}</LastName>

<Gender></Gender>
<BirthMonth></BirthMonth>
<BirthYear></BirthYear>
<BirthDay></BirthDay>
<IsEmployee></IsEmployee>
<customerID></customerID>
</CustomerData>
')

为了可读性,我只添加了几个节点,您只需要粘贴其余的节点。

您能给我们展示一个需要创建什么的示例吗?@christiandev我尝试使用xmlpath以xml格式获取sql数据。我可以获取数据,但是放入所有空的XML元素是一件痛苦的事情。我尝试了一个Java程序从SQL中获取数据并创建XML。它可以工作,但是我必须单独部署JavaAppln,并创建一个批来每天运行它。我想知道是否还有其他更简单的方法,尤其是在微软的世界里。要给@Jim V的建议一个try.updated qn和示例XML,最好的解决方案可能是通过SELECT语句和FOR XML子句直接从表中提取。如果您需要使用FOR XML子句的帮助,请发布表的结构,我们将为您提供帮助。@Jayvee select是一个简单的select,但我只需要表中的很少值,其余的XML将为空。-从kc_consumerV中选择A1.FirstName和A1.LastName-我希望在光标中显示它并重复创建节点。当我尝试这样做时,我得到了一个XML解析错误。这个评论部分不允许我复制hereV中的代码,因为他的方法可以很好地工作。我不得不进一步拆分xml,因为当我尝试一起进行替换时,替换无法正常工作。谢谢,这似乎是一个简单明了的解决方案。然而,由于我的数据包含特殊字符,我得到了非法的xml字符错误——xml解析:第1行,字符225029,非法的xml字符。我想使用TYPE属性,但它给了我更多的错误。有没有办法包括TYPE属性或获取特殊字符作为数据的一部分?@user1824496-如果您知道哪个字符是导致问题的字符,可以用&x;不包括引号,x是您可以在该表中找到的字符的名称:@user1824496-通过替换字符,我的意思是,例如:replaceyourcolumn,'