如何创建一个元素及其值将在xml中的其他元素值上计算? [英] how to create an element and its value will be compute on other element value in xml?

查看:66
本文介绍了如何创建一个元素及其值将在xml中的其他元素值上计算?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好。我正在处理XML。我想创建一个元素,它的值将被计算为其他元素值的总和,如下所示

Hello all.I am working on XML.I want to create an element and its value will be computed as the sum of the other elements values like as follows

<Name>
  <firstName>Christophe</firstName>
  <middleName>Robert</middleName>
  <lastName>Mulford</lastName>
  <maidenName/>
  <suffix>SR</suffix>
  <autoLastName>Mulford SR</autoLastName>
  <autoFullName>Christophe Robert Mulford SR</autoFullName>
</Name>





在上面的代码中,元素名称是XML复杂数据类型



in the above code the element Name is of XML complex data type

<xs:complexType name="cdms_DetailedName">
       <xs:sequence>
           <xs:element name="firstName" type="xs:string"/>
           <xs:element name="middleName" type="xs:string"/>
           <xs:element name="lastName" type="xs:string"> </xs:element>
           <xs:element name="maidenName" type="xs:string"/>
           <xs:element name="suffix">
               <xs:simpleType>
                   <xs:restriction base="xs:string">
                       <xs:enumeration value="JR"/>
                       <xs:enumeration value="SR"/>
                       <xs:enumeration value="II"/>
                       <xs:enumeration value="III"/>
                       <xs:enumeration value="IV"/>
                       <xs:enumeration value="V"/>
                   </xs:restriction>
               </xs:simpleType>
           </xs:element>
           <xs:element name="autoLastName"/>
           <xs:element name="autoFullName"/>
       </xs:sequence>
   </xs:complexType>







autoFullName firstName +'' ''+ middleName +'' ''+ lastName +'' ''+ suffix

的结果



我想通过一次在XML模式文件或XML数据类型中指定公式来自动执行此操作,以便 autoFullName 元素将自动计算。




and the autoFullName is the result of firstName+'' ''+middleName+'' ''+lastName+'' ''+suffix


I want to do this automatically by specifying a formula in XML schema file or in the XML data type at once so that the autoFullName element will be computed automatically.

推荐答案

创建此程序

Create this procedure
CREATE PROCEDURE PopulateFullNameInThisXML
	@XmlData XML
AS
BEGIN

DECLARE @xmltble TABLE
(
        firstName NVARCHAR(MAX),
        middleName NVARCHAR(MAX),
        lastName NVARCHAR(MAX),
        maidenName NVARCHAR(MAX),
        suffix NVARCHAR(MAX),
        autoLastName NVARCHAR(MAX),
        autoFullName NVARCHAR(MAX)
)


INSERT INTO @xmltble
select 
R.i.query('firstName').value('.', 'varchar(30)') [firstName],
R.i.query('middleName').value('.', 'varchar(30)') [middleName],
R.i.query('lastName').value('.', 'varchar(30)') [lastName],
R.i.query('maidenName').value('.', 'varchar(30)') [maidenName],
R.i.query('suffix').value('.', 'varchar(30)') [suffix],
R.i.query('autoLastName').value('.', 'varchar(30)') [autoLastName],
R.i.query('autoFullName').value('.', 'varchar(30)') [autoFullName]
from @XmlData.nodes('/Name') R(i)


SELECT 
 [firstName],
 [middleName],
 [lastName],
 [maidenName],
 [suffix],
 lastName + suffix AS [autoLastName],
 [firstName] + [middleName]  +  lastName + suffix AS [autoFullName]
FROM @xmltble FOR XML PATH('Name')


END





现在使用它如下



Now use it as below

DECLARE @XmlData xml


SET @XmlData='    <name>
        <firstname>Christophe</firstname>
        <middlename>Robert</middlename>
        <lastname>Mulford</lastname>
        <maidenname />
        <suffix>SR</suffix>
        <autolastname>Mulford SR</autolastname>
        <autofullname></autofullname>
      </name>
<name>
        <firstname>Christophe</firstname>
        <middlename>Robert</middlename>
        <lastname>Mulford</lastname>
        <maidenname />
        <suffix>SR</suffix>
        <autolastname>Mulford SR</autolastname>
        <autofullname></autofullname>
      </name>'


exec PopulateFullNameInThisXML @XmlData





你会得到这样的输出





You will get output like this

<Name>
  <firstName>Christophe</firstName>
  <middleName>Robert</middleName>
  <lastName>Mulford</lastName>
  <maidenName></maidenName>
  <suffix>SR</suffix>
  <autoLastName>MulfordSR</autoLastName>
  <autoFullName>ChristopheRobertMulfordSR</autoFullName>
</Name>
<Name>
  <firstName>Christophe</firstName>
  <middleName>Robert</middleName>
  <lastName>Mulford</lastName>
  <maidenName></maidenName>
  <suffix>SR</suffix>
  <autoLastName>MulfordSR</autoLastName>
  <autoFullName>ChristopheRobertMulfordSR</autoFullName>
</Name>


以防万一RD'的解决方案(NO 1)给你适合(正如我在按原样尝试时那样),一个稍微重做的副本做了为我工作。

Just in case RD''s solution (NO 1) is giving you fits (as it did me when I tried it "as-is"), a slightly reworked copy which did work for me.
CREATE PROCEDURE sp_SW_PopulateFullNameInThisXML
	@XmlData XML
	AS
	BEGIN
	
		DECLARE @xmltble TABLE
		(
				[firstName] NVARCHAR(MAX),
				[middleName] NVARCHAR(MAX),
				[lastName] NVARCHAR(MAX),
				[maidenName] NVARCHAR(MAX),
				[suffix] NVARCHAR(MAX),
				[autoLastName] NVARCHAR(MAX),
				[autoFullName] NVARCHAR(MAX)
		)
		INSERT INTO @xmltble
			SELECT
				R.i.value(''firstName[1]'', ''varchar(30)'') AS [firstName],
				R.i.value(''middleName[1]'', ''varchar(30)'') AS [middleName],
				R.i.value(''lastName[1]'', ''varchar(30)'') AS [lastName],
				R.i.value(''maidenName[1]'', ''varchar(30)'') AS [maidenName],
				R.i.value(''suffix[1]'', ''varchar(30)'') AS [suffix],
				R.i.value(''autoLastName[1]'', ''varchar(30)'') AS [autoLastName],
				R.i.value(''autoFullName[1]'', ''varchar(30)'') AS [autoFullName]
					FROM @XmlData.nodes(''/name'') AS R(i)
		 
		SELECT 
			 [firstName],
				[middleName],
					[lastName],
						[maidenName],
							[suffix],
								[lastName] + [suffix] AS [autoLastName],
									[firstName] + [middleName] + [lastName] + [suffix] AS [autoFullName]
				FROM @xmltble FOR XML PATH(''Name'')
	END 		



运行SP


Run the SP

DECLARE @XmlData xml
SET @XmlData   =         ''<name>
				<firstname>Christophe</firstname>
				<middlename>Robert</middlename>
				<lastname>Mulford</lastname>
				<maidenname></maidenname>
				<suffix>SR</suffix>
				<autolastname>Mulford SR</autolastname>
				<autofullname></autofullname>
			  </name>
			  <name>
				<firstname>Christophe</firstname>
				<middlename>Robert</middlename>
				<lastname>Mulford</lastname>
				<maidenname></maidenname>
				<suffix>SR</suffix>
				<autolastname>Mulford SR</autolastname>
				<autofullname></autofullname>
			  </name>''

EXEC sp_SW_PopulateFullNameInThisXML @XmlData		



感谢您的帮助RD ..我真的很挣扎SW的确切问题!


Thanks for the help RD .. I really was struggling with SW''s exact problem!


这篇关于如何创建一个元素及其值将在xml中的其他元素值上计算?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆