从SQL数据创建XML
我有一个巨大的XML,有150多个元素和属性。我只需要用SQLServer2008表中的数据填充其中的少数5或6个元素。这个创建的xml需要传递给一个webservice到ESB,并且这必须按每日计划进行 我认为,在这里使用XML路径来创建XML和使用SSI是没有意义的。有人能建议一种方法吗 这是示例XML。我只需要姓名、地址和几个ID从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 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,'