MSSQL教程之SQL Server 2000 XML之七种刀兵
有了数据以后,我们就要想一个比较统一的方法来闪回。上面我们说了对于DML操作,可以通过反向执行所有逆操作来实现,对于语句里面的DDL,只能直接跳过。原因是一个DDL不一定有直接的逆操作。server|xmlXML,已成为最近最抢手的Web手艺,它是SQLServer2000中的主要部分。本文将综合七条SQLServer2000中最主要的XML综合特征构成XML之七种刀兵。刀兵之一:FORXML
在SQLServer2000中,尺度的T-SQLSELECT语句包含FORXML子句,它以XML文档情势前往一个查询了局。新的FORXML子句有三种形式——RAW,AUTO,和EXPLICIT,每一个都能对XML文档格局供应附加尺度的把持。
上面起首先容“FORXML”的利用办法。
为了从SQLServer提取XML格局的数据,T-SQL中到场了一个FORXML命令。在查询命令中利用FORXML命令使得查询了局以XML格局呈现。FORXML命令有三种形式:RAW,AUTO和EXPLICIT。所显现的SQL命令会见SQLServer供应的Pubs示例数据库。有关Pubs数据库的更多信息,请拜见MSDN申明。假如我们顺次指定该SQL命令的形式为三种同意的形式之一,就能够失掉各类形式所撑持的分歧XML输入。
【】
SELECTstore.stor_idasId,stor_nameasName,
sale.ord_numasOrderNo,sale.qtyasQty
FROMstoresstoreinnerjoin
salessaleonstore.stor_id=sale.stor_id
ORDERBYstor_name
FORXML<形式>
该查询命令所天生的了局包括一切发卖纪录及其对应的商铺,了局以商铺称号的字母升序分列。查询的最初加上了FORXML命令和详细的形式,好比FORXMLRAW。
幻想情形下,SQL命令所天生的XML文档应具有以下布局:
<Stores>
<StoreId=&single;&single;Name=&single;&single;>
</SaleOrderNo=&single;&single;Qty=&single;&single;>
</Store>
</Stores>
上面我们来看看详细的处置办法。
RAW形式
上面是指定RAW形式时了局XML文档的一个片段。
查询了局会合每个纪录包括独一的元素<row>。因为我们没法把持元素名字和文档布局,因而这类形式不是很有效。RAW形式所天生的文档布局与我们所但愿的不符,并且它的用处也十分无限。
AUTO形式
上面是指定AUTO形式时了局文档的一个片段:
能够看到,<Stroe>和<Sale>两个元素是父-子干系,构成了我们所但愿的条理布局。这类节点干系由查询中表的声明序次决意,后声明的表成为前声明表的孩子。
再参考,我们能够看出查询命令所指定的别号决意了XML文档中的名字。依据这一点,我们能够把持XML文档元素、属性的名字,使得这些名字切合我们所请求的定名常规。
可见AUTO形式可以创立出我们所必要的XML文档。不外它存在以下弱点:
固然能够失掉条理布局,但这类条理布局是线性的,即每一个父节点只能有一个子节点,反之亦然。
经由过程别号指定元素名字不太便利,并且偶然候会影响查询命令自己的可读性。
没法在文档中同时天生元素和属性。要末全体是元素(经由过程ELEMENTS关头词指定),要末全体是属性(默许)。EXPLICIT形式办理了上述不敷。
EXPLICIT形式
EXPLICIT形式对照庞大,我们将用别的一种办法来表达所显现的查询。这类办法使得我们可以完整地把持查询所天生的XML文档。起首我们将先容怎样改用EXPLICIT形式编写所显现的查询,然后看看这类办法怎样付与我们远远凌驾AUTO形式的才能。
上面是查询用EXPLICIT形式表达的代码:
【】
--商铺数据
SELECT1asTag,
NULLasParent,
s.stor_idas,
s.stor_nameas,
NULLas,
NULLas
FROMstoress
UNIONALL
--发卖数据
SELECT2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty
FROMstoress,salessa
WHEREs.stor_id=sa.stor_id
ORDERBY
FORXMLEXPLICIT
这个查询初看起来有点庞大,实在它只是把分歧的数据集(即这里的Store和Sale)分化到了自力的SELECT语句里,然后再用UNIONALL操纵符保持成一个查询。
我们之以是要把查询写成下面的情势,是为了让查询了局不但包括XML文档所形貌的数据,并且还包括形貌XML文档布局的元数据。上述查询所天生的表称为Universal表,sqlxml.dll天生XML文档时必要这类格局。Universal表关于编写代码的人来讲是通明的,但懂得这个表仍是很成心义的,它将有助于代码的开辟和调试。上面是Universal表的一个例子:
TagParentstore!1!idstore!1!namesale!2!ordernosale!2!qty
1NULL7066Barnum&single;sNULLNULL
217066Barnum&single;sA29765050
217066Barnum&single;sQA7442375
1NULL8042BookbeatNULLNULL
218042Bookbeat423LL92215
Universal表和EXPLICIT形式查询的元数据部分都以白色暗示,玄色暗示数据。对照查询和表就能够找出sqlxml.dll天生XML文档所必要的元素。我们来细心地剖析一下它们形貌的是甚么。
Tag和Parent列是XML文档条理布局方面的信息,我们能够以为中的每一个SELECT语句代表了一个XML节点,而Tag和Parent列让我们指定节点在文档条理布局中的地位。假如在第二个SELECT语句中指定Tag为2、指定Parent为1,就暗示为这些数据加上了一个值为2的标签,而这些数据的父亲是那些标签为1的数据(即第一个SELECT语句)。这就使得我们可以机关出<Store>和<Sale>之间的父-子干系,并且正如你大概料想到的,它使得我们能够天生恣意正当的XML文档布局。注重第一个SELECT命令的parent列设置成了NULL,这暗示<Store>元素处于最顶层的地位。
以玄色暗示的数据将成为节点的属性或元素,比方,Store_ID就经由过程列名供应了这方面的信息。列名字中的“!”是分开符,统共可分红四项(四个参数),个中第四个参数是可选的。这些参数形貌的是:
第一个参数形貌该列所属元素的名字,在这里是<Store>元素。
第二个是标签编号,它指定了该列信息在XML树形布局中所处地位。
第三个参数指定XML文档内的属性或元素名字。在这里名字指定为id。
数据列默许被创立为参数2所指定节点的属性,即id将成为<Store>节点的属性。假如要指定id是<Store>的一个子元素,我们可使用第四个可选的参数,这个参数的一个感化就是让我们把该项指定为元素,比方store!1!id!element。
因为利用了UNIONALL操纵符来保持SELECT语句,为了包管SQL查询的正当性,一切SELECT语句的选择了局必需具有不异数目的列。我们利用NULL关头词来补足SELECT语句,从而制止了反复数据。
经由过程EXPLICIT形式查询所天生的XML文档和经由过程AUTO形式天生的完整不异,那末为何要创立EXPLICIT形式查询呢?
假定如今有人请求在XML文档中包括商铺的打折信息。检察Pubs数据库,我们得知每一个商铺都能够有0到n局限内的扣头率。因而,一种公道的办法是在<Store>元素上面加上子元素<Discount>,如许我们就失掉以下XML文档布局:
<STORES>
<STOREId=&single;&single;Name=&single;&single;>
<DISCOUNTType=&single;&single;LowQty=&single;&single;HighQty=&single;&single;>
<AMOUNT></AMOUNT>
</DISCOUNT>
<SALEOrdNo=&single;&single;Qty=&single;&single;>
</SALE>
</STORE>
</STORES>
这里的修改包含:
要在<Sale>元素地点的条理增添一个XML元素<Discount>,即<Discount>是<Stroe>的子元素。
Amount嵌套在<Discount>内里,但不该该是<Discount>元素的属性。
在AUTO形式中是不成能完成这些修改的。
上面是创立这个新XML文档的EXPLICIT形式查询:
【A】
SELECT1asTag,NULLasParent,
s.stor_idas,
s.stor_nameas,
NULLas,
NULLas,
NULLas,
NULLas,
NULLas,
NULLas
FROMstoress
UNIONALL
SELECT2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty,
NULL,
NULL,
NULL,
NULL
FROMstoress,salessa
WHEREs.stor_id=sa.stor_id
UNIONALL
SELECT3,1,
NULL,
s.stor_name,
NULL,
NULL,
d.discounttype,
d.lowqty,
d.highqty,
d.discount
FROMstoress,discountsd
WHEREs.stor_id=d.stor_id
ORDERBY
ForXMLEXPLICIT
为了创立A所显现的EXPLICIT形式查询,我们对的查询举行了以下修正:
增添了第三个子查询提取扣头数据,经由过程Tag列声明这些数据的标签值为3。
经由过程指定Parent列为1将扣头数据设置成<Store>元素的子元素。
注重在第三个SELECT子查询中我们只包括了那些必须的列,并用NULL补足空列。这个子查询包括store_name列,固然Discount元素其实不要用到这个列,但假如把这个列也设置为NULL,则了局Universal表将不会依照剖析器所请求的那样以节点升序排序(无妨本人试一下看看)。Universal表的排序列也能够用Tag列替换。
为保持了局Universal表的完全性,第1、二两个SELECT语句也用NULL补足以反应为扣头数据增添的列。
为指定新扣头列的元数据修正了第一个SELECT语句。
经由过程在第四个参数中声明element指定Amount列为Discount的一个元素(element是可在第四个参数中声明的多个指令之一)。
上面这个XML文档只能用EXPLICIT形式天生:
了局XML文档中不会显现出NULL数据,如扣头lowqty和highqty。
看来下面的先容,人人大概已对FORXML的语法有所懂得。经由过程FORXML我们在可以在QueryAnalyzer中间接前往一个XML格局的数据大概经由过程其他多样化体现体例将XML格局的数据显现出来,好比能够将数据显现在扫瞄器上。上面这个例子就利用FORXML和ADO将数据输入到扫瞄器的例子。
DimadoConn
SetadoConn=Server.CreateObject("ADODB.Connection")
DimsConn
sConn="Provider=SQLOLEDB;DataSource=192.168.0.160;InitialCatalog=Northwind;UserID=SA;Password=;"
adoConn.ConnectionString=sConn
adoConn.CursorLocation=adUseClient
adoConn.Open
DimadoCmd
SetadoCmd=Server.CreateObject("ADODB.Command")
SetadoCmd.ActiveConnection=adoConn
DimsQuery
‘界说FORXML的查询。详细的语法在今后的章节中将具体先容。
sQuery="<ROOTxmlns:sql=urn:schemas-microsoft-com:xml-sql><sql:query>SELECT*FROMPRODUCTSORDERBYPRODUCTNAMEFORXMLAUTO</sql:query></ROOT>"
‘创建ADODBStream工具,ADODBStream工具必要ADO2.5以上版本撑持,它能够将纪录集转换为数据流。
DimadoStreamQuery
SetadoStreamQuery=Server.CreateObject("ADODB.Stream")
adoStreamQuery.Open
adoStreamQuery.WriteTextsQuery,adWriteChar
adoStreamQuery.Position=0
adoCmd.CommandStream=adoStreamQuery
adoCmd.Dialect="{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"
Response.write"PushingXMLtoclientforprocessing"&"<BR/>"
adoCmd.Properties("OutputStream")=Response
‘输入XML格局的文本
Response.write"<XMLID=MyDataIsle>"
adoCmd.Execute,,adExecuteStream
Response.write"</XML>"
‘经由过程IE的XML剖析器,利用DOM办法将XML的文本转换为HTML
EXPLICIT形式
EXPLICIT形式对照庞大,我们将用别的一种办法来表达所显现的查询。这类办法使得我们可以完整地把持查询所天生的XML文档。起首我们将先容怎样改用EXPLICIT形式编写所显现的查询,然后看看这类办法怎样付与我们远远凌驾AUTO形式的才能。
上面是查询用EXPLICIT形式表达的代码:
【】
--商铺数据
SELECT1asTag,
NULLasParent,
s.stor_idas,
s.stor_nameas,
NULLas,
NULLas
FROMstoress
UNIONALL
--发卖数据
SELECT2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty
FROMstoress,salessa
WHEREs.stor_id=sa.stor_id
ORDERBY
FORXMLEXPLICIT
这个查询初看起来有点庞大,实在它只是把分歧的数据集(即这里的Store和Sale)分化到了自力的SELECT语句里,然后再用UNIONALL操纵符保持成一个查询。
我们之以是要把查询写成下面的情势,是为了让查询了局不但包括XML文档所形貌的数据,并且还包括形貌XML文档布局的元数据。上述查询所天生的表称为Universal表,sqlxml.dll天生XML文档时必要这类格局。Universal表关于编写代码的人来讲是通明的,但懂得这个表仍是很成心义的,它将有助于代码的开辟和调试。上面是Universal表的一个例子:
TagParentstore!1!idstore!1!namesale!2!ordernosale!2!qty
1NULL7066Barnum&single;sNULLNULL
217066Barnum&single;sA29765050
217066Barnum&single;sQA7442375
1NULL8042BookbeatNULLNULL
218042Bookbeat423LL92215
Universal表和EXPLICIT形式查询的元数据部分都以白色暗示,玄色暗示数据。对照查询和表就能够找出sqlxml.dll天生XML文档所必要的元素。我们来细心地剖析一下它们形貌的是甚么。
Tag和Parent列是XML文档条理布局方面的信息,我们能够以为中的每一个SELECT语句代表了一个XML节点,而Tag和Parent列让我们指定节点在文档条理布局中的地位。假如在第二个SELECT语句中指定Tag为2、指定Parent为1,就暗示为这些数据加上了一个值为2的标签,而这些数据的父亲是那些标签为1的数据(即第一个SELECT语句)。这就使得我们可以机关出<Store>和<Sale>之间的父-子干系,并且正如你大概料想到的,它使得我们能够天生恣意正当的XML文档布局。注重第一个SELECT命令的parent列设置成了NULL,这暗示<Store>元素处于最顶层的地位。
以玄色暗示的数据将成为节点的属性或元素,比方,Store_ID就经由过程列名供应了这方面的信息。列名字中的“!”是分开符,统共可分红四项(四个参数),个中第四个参数是可选的。这些参数形貌的是:
第一个参数形貌该列所属元素的名字,在这里是<Store>元素。
第二个是标签编号,它指定了该列信息在XML树形布局中所处地位。
第三个参数指定XML文档内的属性或元素名字。在这里名字指定为id。
数据列默许被创立为参数2所指定节点的属性,即id将成为<Store>节点的属性。假如要指定id是<Store>的一个子元素,我们可使用第四个可选的参数,这个参数的一个感化就是让我们把该项指定为元素,比方store!1!id!element。
因为利用了UNIONALL操纵符来保持SELECT语句,为了包管SQL查询的正当性,一切SELECT语句的选择了局必需具有不异数目的列。我们利用NULL关头词来补足SELECT语句,从而制止了反复数据。
经由过程EXPLICIT形式查询所天生的XML文档和经由过程AUTO形式天生的完整不异,那末为何要创立EXPLICIT形式查询呢?
假定如今有人请求在XML文档中包括商铺的打折信息。检察Pubs数据库,我们得知每一个商铺都能够有0到n局限内的扣头率。因而,一种公道的办法是在<Store>元素上面加上子元素<Discount>,如许我们就失掉以下XML文档布局:
<STORES>
<STOREId=&single;&single;Name=&single;&single;>
<DISCOUNTType=&single;&single;LowQty=&single;&single;HighQty=&single;&single;>
<AMOUNT></AMOUNT>
</DISCOUNT>
<SALEOrdNo=&single;&single;Qty=&single;&single;>
</SALE>
</STORE>
</STORES>
这里的修改包含:
要在<Sale>元素地点的条理增添一个XML元素<Discount>,即<Discount>是<Stroe>的子元素。
Amount嵌套在<Discount>内里,但不该该是<Discount>元素的属性。
在AUTO形式中是不成能完成这些修改的。
上面是创立这个新XML文档的EXPLICIT形式查询:
【A】
SELECT1asTag,NULLasParent,
s.stor_idas,
s.stor_nameas,
NULLas,
NULLas,
NULLas,
NULLas,
NULLas,
NULLas
FROMstoress
UNIONALL
SELECT2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty,
NULL,
NULL,
NULL,
NULL
FROMstoress,salessa
WHEREs.stor_id=sa.stor_id
UNIONALL
SELECT3,1,
NULL,
s.stor_name,
NULL,
NULL,
d.discounttype,
d.lowqty,
d.highqty,
d.discount
FROMstoress,discountsd
WHEREs.stor_id=d.stor_id
ORDERBY
ForXMLEXPLICIT
为了创立A所显现的EXPLICIT形式查询,我们对的查询举行了以下修正:
增添了第三个子查询提取扣头数据,经由过程Tag列声明这些数据的标签值为3。
经由过程指定Parent列为1将扣头数据设置成<Store>元素的子元素。
注重在第三个SELECT子查询中我们只包括了那些必须的列,并用NULL补足空列。这个子查询包括store_name列,固然Discount元素其实不要用到这个列,但假如把这个列也设置为NULL,则了局Universal表将不会依照剖析器所请求的那样以节点升序排序(无妨本人试一下看看)。Universal表的排序列也能够用Tag列替换。
为保持了局Universal表的完全性,第1、二两个SELECT语句也用NULL补足以反应为扣头数据增添的列。
为指定新扣头列的元数据修正了第一个SELECT语句。
经由过程在第四个参数中声明element指定Amount列为Discount的一个元素(element是可在第四个参数中声明的多个指令之一)。
上面这个XML文档只能用EXPLICIT形式天生:
了局XML文档中不会显现出NULL数据,如扣头lowqty和highqty。
看来下面的先容,人人大概已对FORXML的语法有所懂得。经由过程FORXML我们在可以在QueryAnalyzer中间接前往一个XML格局的数据大概经由过程其他多样化体现体例将XML格局的数据显现出来,好比能够将数据显现在扫瞄器上。上面这个例子就利用FORXML和ADO将数据输入到扫瞄器的例子。
DimadoConn
SetadoConn=Server.CreateObject("ADODB.Connection")
DimsConn
sConn="Provider=SQLOLEDB;DataSource=192.168.0.160;InitialCatalog=Northwind;UserID=SA;Password=;"
adoConn.ConnectionString=sConn
adoConn.CursorLocation=adUseClient
adoConn.Open
DimadoCmd
SetadoCmd=Server.CreateObject("ADODB.Command")
SetadoCmd.ActiveConnection=adoConn
DimsQuery
‘界说FORXML的查询。详细的语法在今后的章节中将具体先容。
sQuery="<ROOTxmlns:sql=urn:schemas-microsoft-com:xml-sql><sql:query>SELECT*FROMPRODUCTSORDERBYPRODUCTNAMEFORXMLAUTO</sql:query></ROOT>"
‘创建ADODBStream工具,ADODBStream工具必要ADO2.5以上版本撑持,它能够将纪录集转换为数据流。
DimadoStreamQuery
SetadoStreamQuery=Server.CreateObject("ADODB.Stream")
adoStreamQuery.Open
adoStreamQuery.WriteTextsQuery,adWriteChar
adoStreamQuery.Position=0
adoCmd.CommandStream=adoStreamQuery
adoCmd.Dialect="{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"
Response.write"PushingXMLtoclientforprocessing"&"<BR/>"
adoCmd.Properties("OutputStream")=Response
‘输入XML格局的文本
Response.write"<XMLID=MyDataIsle>"
adoCmd.Execute,,adExecuteStream
Response.write"</XML>"
‘经由过程IE的XML剖析器,利用DOM办法将XML的文本转换为HTML
EXPLICIT形式
EXPLICIT形式对照庞大,我们将用别的一种办法来表达所显现的查询。这类办法使得我们可以完整地把持查询所天生的XML文档。起首我们将先容怎样改用EXPLICIT形式编写所显现的查询,然后看看这类办法怎样付与我们远远凌驾AUTO形式的才能。
上面是查询用EXPLICIT形式表达的代码:
【】
--商铺数据
SELECT1asTag,
NULLasParent,
s.stor_idas,
s.stor_nameas,
NULLas,
NULLas
FROMstoress
UNIONALL
--发卖数据
SELECT2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty
FROMstoress,salessa
WHEREs.stor_id=sa.stor_id
ORDERBY
FORXMLEXPLICIT
这个查询初看起来有点庞大,实在它只是把分歧的数据集(即这里的Store和Sale)分化到了自力的SELECT语句里,然后再用UNIONALL操纵符保持成一个查询。
我们之以是要把查询写成下面的情势,是为了让查询了局不但包括XML文档所形貌的数据,并且还包括形貌XML文档布局的元数据。上述查询所天生的表称为Universal表,sqlxml.dll天生XML文档时必要这类格局。Universal表关于编写代码的人来讲是通明的,但懂得这个表仍是很成心义的,它将有助于代码的开辟和调试。上面是Universal表的一个例子:
TagParentstore!1!idstore!1!namesale!2!ordernosale!2!qty
1NULL7066Barnum&single;sNULLNULL
217066Barnum&single;sA29765050
217066Barnum&single;sQA7442375
1NULL8042BookbeatNULLNULL
218042Bookbeat423LL92215
Universal表和EXPLICIT形式查询的元数据部分都以白色暗示,玄色暗示数据。对照查询和表就能够找出sqlxml.dll天生XML文档所必要的元素。我们来细心地剖析一下它们形貌的是甚么。
Tag和Parent列是XML文档条理布局方面的信息,我们能够以为中的每一个SELECT语句代表了一个XML节点,而Tag和Parent列让我们指定节点在文档条理布局中的地位。假如在第二个SELECT语句中指定Tag为2、指定Parent为1,就暗示为这些数据加上了一个值为2的标签,而这些数据的父亲是那些标签为1的数据(即第一个SELECT语句)。这就使得我们可以机关出<Store>和<Sale>之间的父-子干系,并且正如你大概料想到的,它使得我们能够天生恣意正当的XML文档布局。注重第一个SELECT命令的parent列设置成了NULL,这暗示<Store>元素处于最顶层的地位。
以玄色暗示的数据将成为节点的属性或元素,比方,Store_ID就经由过程列名供应了这方面的信息。列名字中的“!”是分开符,统共可分红四项(四个参数),个中第四个参数是可选的。这些参数形貌的是:
第一个参数形貌该列所属元素的名字,在这里是<Store>元素。
第二个是标签编号,它指定了该列信息在XML树形布局中所处地位。
第三个参数指定XML文档内的属性或元素名字。在这里名字指定为id。
数据列默许被创立为参数2所指定节点的属性,即id将成为<Store>节点的属性。假如要指定id是<Store>的一个子元素,我们可使用第四个可选的参数,这个参数的一个感化就是让我们把该项指定为元素,比方store!1!id!element。
因为利用了UNIONALL操纵符来保持SELECT语句,为了包管SQL查询的正当性,一切SELECT语句的选择了局必需具有不异数目的列。我们利用NULL关头词来补足SELECT语句,从而制止了反复数据。
经由过程EXPLICIT形式查询所天生的XML文档和经由过程AUTO形式天生的完整不异,那末为何要创立EXPLICIT形式查询呢?
假定如今有人请求在XML文档中包括商铺的打折信息。检察Pubs数据库,我们得知每一个商铺都能够有0到n局限内的扣头率。因而,一种公道的办法是在<Store>元素上面加上子元素<Discount>,如许我们就失掉以下XML文档布局:
<STORES>
<STOREId=&single;&single;Name=&single;&single;>
<DISCOUNTType=&single;&single;LowQty=&single;&single;HighQty=&single;&single;>
<AMOUNT></AMOUNT>
</DISCOUNT>
<SALEOrdNo=&single;&single;Qty=&single;&single;>
</SALE>
</STORE>
</STORES>
这里的修改包含:
要在<Sale>元素地点的条理增添一个XML元素<Discount>,即<Discount>是<Stroe>的子元素。
Amount嵌套在<Discount>内里,但不该该是<Discount>元素的属性。
在AUTO形式中是不成能完成这些修改的。
上面是创立这个新XML文档的EXPLICIT形式查询:
【A】
SELECT1asTag,NULLasParent,
s.stor_idas,
s.stor_nameas,
NULLas,
NULLas,
NULLas,
NULLas,
NULLas,
NULLas
FROMstoress
UNIONALL
SELECT2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty,
NULL,
NULL,
NULL,
NULL
FROMstoress,salessa
WHEREs.stor_id=sa.stor_id
UNIONALL
SELECT3,1,
NULL,
s.stor_name,
NULL,
NULL,
d.discounttype,
d.lowqty,
d.highqty,
d.discount
FROMstoress,discountsd
WHEREs.stor_id=d.stor_id
ORDERBY
ForXMLEXPLICIT
为了创立A所显现的EXPLICIT形式查询,我们对的查询举行了以下修正:
增添了第三个子查询提取扣头数据,经由过程Tag列声明这些数据的标签值为3。
经由过程指定Parent列为1将扣头数据设置成<Store>元素的子元素。
注重在第三个SELECT子查询中我们只包括了那些必须的列,并用NULL补足空列。这个子查询包括store_name列,固然Discount元素其实不要用到这个列,但假如把这个列也设置为NULL,则了局Universal表将不会依照剖析器所请求的那样以节点升序排序(无妨本人试一下看看)。Universal表的排序列也能够用Tag列替换。
为保持了局Universal表的完全性,第1、二两个SELECT语句也用NULL补足以反应为扣头数据增添的列。
为指定新扣头列的元数据修正了第一个SELECT语句。
经由过程在第四个参数中声明element指定Amount列为Discount的一个元素(element是可在第四个参数中声明的多个指令之一)。
上面这个XML文档只能用EXPLICIT形式天生:
了局XML文档中不会显现出NULL数据,如扣头lowqty和highqty。
看来下面的先容,人人大概已对FORXML的语法有所懂得。经由过程FORXML我们在可以在QueryAnalyzer中间接前往一个XML格局的数据大概经由过程其他多样化体现体例将XML格局的数据显现出来,好比能够将数据显现在扫瞄器上。上面这个例子就利用FORXML和ADO将数据输入到扫瞄器的例子。
DimadoConn
SetadoConn=Server.CreateObject("ADODB.Connection")
DimsConn
sConn="Provider=SQLOLEDB;DataSource=192.168.0.160;InitialCatalog=Northwind;UserID=SA;Password=;"
adoConn.ConnectionString=sConn
adoConn.CursorLocation=adUseClient
adoConn.Open
DimadoCmd
SetadoCmd=Server.CreateObject("ADODB.Command")
SetadoCmd.ActiveConnection=adoConn
DimsQuery
‘界说FORXML的查询。详细的语法在今后的章节中将具体先容。
sQuery="<ROOTxmlns:sql=urn:schemas-microsoft-com:xml-sql><sql:query>SELECT*FROMPRODUCTSORDERBYPRODUCTNAMEFORXMLAUTO</sql:query></ROOT>"
‘创建ADODBStream工具,ADODBStream工具必要ADO2.5以上版本撑持,它能够将纪录集转换为数据流。
DimadoStreamQuery
SetadoStreamQuery=Server.CreateObject("ADODB.Stream")
adoStreamQuery.Open
adoStreamQuery.WriteTextsQuery,adWriteChar
adoStreamQuery.Position=0
adoCmd.CommandStream=adoStreamQuery
adoCmd.Dialect="{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"
Response.write"PushingXMLtoclientforprocessing"&"<BR/>"
adoCmd.Properties("OutputStream")=Response
‘输入XML格局的文本
Response.write"<XMLID=MyDataIsle>"
adoCmd.Execute,,adExecuteStream
Response.write"</XML>"
‘经由过程IE的XML剖析器,利用DOM办法将XML的文本转换为HTML
EXPLICIT形式
EXPLICIT形式对照庞大,我们将用别的一种办法来表达所显现的查询。这类办法使得我们可以完整地把持查询所天生的XML文档。起首我们将先容怎样改用EXPLICIT形式编写所显现的查询,然后看看这类办法怎样付与我们远远凌驾AUTO形式的才能。
上面是查询用EXPLICIT形式表达的代码:
【】
--商铺数据
SELECT1asTag,
NULLasParent,
s.stor_idas,
s.stor_nameas,
NULLas,
NULLas
FROMstoress
UNIONALL
--发卖数据
SELECT2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty
FROMstoress,salessa
WHEREs.stor_id=sa.stor_id
ORDERBY
FORXMLEXPLICIT
这个查询初看起来有点庞大,实在它只是把分歧的数据集(即这里的Store和Sale)分化到了自力的SELECT语句里,然后再用UNIONALL操纵符保持成一个查询。
我们之以是要把查询写成下面的情势,是为了让查询了局不但包括XML文档所形貌的数据,并且还包括形貌XML文档布局的元数据。上述查询所天生的表称为Universal表,sqlxml.dll天生XML文档时必要这类格局。Universal表关于编写代码的人来讲是通明的,但懂得这个表仍是很成心义的,它将有助于代码的开辟和调试。上面是Universal表的一个例子:
TagParentstore!1!idstore!1!namesale!2!ordernosale!2!qty
1NULL7066Barnum&single;sNULLNULL
217066Barnum&single;sA29765050
217066Barnum&single;sQA7442375
1NULL8042BookbeatNULLNULL
218042Bookbeat423LL92215
Universal表和EXPLICIT形式查询的元数据部分都以白色暗示,玄色暗示数据。对照查询和表就能够找出sqlxml.dll天生XML文档所必要的元素。我们来细心地剖析一下它们形貌的是甚么。
Tag和Parent列是XML文档条理布局方面的信息,我们能够以为中的每一个SELECT语句代表了一个XML节点,而Tag和Parent列让我们指定节点在文档条理布局中的地位。假如在第二个SELECT语句中指定Tag为2、指定Parent为1,就暗示为这些数据加上了一个值为2的标签,而这些数据的父亲是那些标签为1的数据(即第一个SELECT语句)。这就使得我们可以机关出<Store>和<Sale>之间的父-子干系,并且正如你大概料想到的,它使得我们能够天生恣意正当的XML文档布局。注重第一个SELECT命令的parent列设置成了NULL,这暗示<Store>元素处于最顶层的地位。
以玄色暗示的数据将成为节点的属性或元素,比方,Store_ID就经由过程列名供应了这方面的信息。列名字中的“!”是分开符,统共可分红四项(四个参数),个中第四个参数是可选的。这些参数形貌的是:
第一个参数形貌该列所属元素的名字,在这里是<Store>元素。
第二个是标签编号,它指定了该列信息在XML树形布局中所处地位。
第三个参数指定XML文档内的属性或元素名字。在这里名字指定为id。
数据列默许被创立为参数2所指定节点的属性,即id将成为<Store>节点的属性。假如要指定id是<Store>的一个子元素,我们可使用第四个可选的参数,这个参数的一个感化就是让我们把该项指定为元素,比方store!1!id!element。
因为利用了UNIONALL操纵符来保持SELECT语句,为了包管SQL查询的正当性,一切SELECT语句的选择了局必需具有不异数目的列。我们利用NULL关头词来补足SELECT语句,从而制止了反复数据。
经由过程EXPLICIT形式查询所天生的XML文档和经由过程AUTO形式天生的完整不异,那末为何要创立EXPLICIT形式查询呢?
假定如今有人请求在XML文档中包括商铺的打折信息。检察Pubs数据库,我们得知每一个商铺都能够有0到n局限内的扣头率。因而,一种公道的办法是在<Store>元素上面加上子元素<Discount>,如许我们就失掉以下XML文档布局:
<STORES>
<STOREId=&single;&single;Name=&single;&single;>
<DISCOUNTType=&single;&single;LowQty=&single;&single;HighQty=&single;&single;>
<AMOUNT></AMOUNT>
</DISCOUNT>
<SALEOrdNo=&single;&single;Qty=&single;&single;>
</SALE>
</STORE>
</STORES>
这里的修改包含:
要在<Sale>元素地点的条理增添一个XML元素<Discount>,即<Discount>是<Stroe>的子元素。
Amount嵌套在<Discount>内里,但不该该是<Discount>元素的属性。
在AUTO形式中是不成能完成这些修改的。
上面是创立这个新XML文档的EXPLICIT形式查询:
【A】
SELECT1asTag,NULLasParent,
s.stor_idas,
s.stor_nameas,
NULLas,
NULLas,
NULLas,
NULLas,
NULLas,
NULLas
FROMstoress
UNIONALL
SELECT2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty,
NULL,
NULL,
NULL,
NULL
FROMstoress,salessa
WHEREs.stor_id=sa.stor_id
UNIONALL
SELECT3,1,
NULL,
s.stor_name,
NULL,
NULL,
d.discounttype,
d.lowqty,
d.highqty,
d.discount
FROMstoress,discountsd
WHEREs.stor_id=d.stor_id
ORDERBY
ForXMLEXPLICIT
为了创立A所显现的EXPLICIT形式查询,我们对的查询举行了以下修正:
增添了第三个子查询提取扣头数据,经由过程Tag列声明这些数据的标签值为3。
经由过程指定Parent列为1将扣头数据设置成<Store>元素的子元素。
注重在第三个SELECT子查询中我们只包括了那些必须的列,并用NULL补足空列。这个子查询包括store_name列,固然Discount元素其实不要用到这个列,但假如把这个列也设置为NULL,则了局Universal表将不会依照剖析器所请求的那样以节点升序排序(无妨本人试一下看看)。Universal表的排序列也能够用Tag列替换。
为保持了局Universal表的完全性,第1、二两个SELECT语句也用NULL补足以反应为扣头数据增添的列。
为指定新扣头列的元数据修正了第一个SELECT语句。
经由过程在第四个参数中声明element指定Amount列为Discount的一个元素(element是可在第四个参数中声明的多个指令之一)。
上面这个XML文档只能用EXPLICIT形式天生:
了局XML文档中不会显现出NULL数据,如扣头lowqty和highqty。
看来下面的先容,人人大概已对FORXML的语法有所懂得。经由过程FORXML我们在可以在QueryAnalyzer中间接前往一个XML格局的数据大概经由过程其他多样化体现体例将XML格局的数据显现出来,好比能够将数据显现在扫瞄器上。上面这个例子就利用FORXML和ADO将数据输入到扫瞄器的例子。
DimadoConn
SetadoConn=Server.CreateObject("ADODB.Connection")
DimsConn
sConn="Provider=SQLOLEDB;DataSource=192.168.0.160;InitialCatalog=Northwind;UserID=SA;Password=;"
adoConn.ConnectionString=sConn
adoConn.CursorLocation=adUseClient
adoConn.Open
DimadoCmd
SetadoCmd=Server.CreateObject("ADODB.Command")
SetadoCmd.ActiveConnection=adoConn
DimsQuery
‘界说FORXML的查询。详细的语法在今后的章节中将具体先容。
sQuery="<ROOTxmlns:sql=urn:schemas-microsoft-com:xml-sql><sql:query>SELECT*FROMPRODUCTSORDERBYPRODUCTNAMEFORXMLAUTO</sql:query></ROOT>"
‘创建ADODBStream工具,ADODBStream工具必要ADO2.5以上版本撑持,它能够将纪录集转换为数据流。
DimadoStreamQuery
SetadoStreamQuery=Server.CreateObject("ADODB.Stream")
adoStreamQuery.Open
adoStreamQuery.WriteTextsQuery,adWriteChar
adoStreamQuery.Position=0
adoCmd.CommandStream=adoStreamQuery
adoCmd.Dialect="{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"
Response.write"PushingXMLtoclientforprocessing"&"<BR/>"
adoCmd.Properties("OutputStream")=Response
‘输入XML格局的文本
Response.write"<XMLID=MyDataIsle>"
adoCmd.Execute,,adExecuteStream
Response.write"</XML>"
‘经由过程IE的XML剖析器,利用DOM办法将XML的文本转换为HTML
EXPLICIT形式
EXPLICIT形式对照庞大,我们将用别的一种办法来表达所显现的查询。这类办法使得我们可以完整地把持查询所天生的XML文档。起首我们将先容怎样改用EXPLICIT形式编写所显现的查询,然后看看这类办法怎样付与我们远远凌驾AUTO形式的才能。
上面是查询用EXPLICIT形式表达的代码:
【】
--商铺数据
SELECT1asTag,
NULLasParent,
s.stor_idas,
s.stor_nameas,
NULLas,
NULLas
FROMstoress
UNIONALL
--发卖数据
SELECT2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty
FROMstoress,salessa
WHEREs.stor_id=sa.stor_id
ORDERBY
FORXMLEXPLICIT
这个查询初看起来有点庞大,实在它只是把分歧的数据集(即这里的Store和Sale)分化到了自力的SELECT语句里,然后再用UNIONALL操纵符保持成一个查询。
我们之以是要把查询写成下面的情势,是为了让查询了局不但包括XML文档所形貌的数据,并且还包括形貌XML文档布局的元数据。上述查询所天生的表称为Universal表,sqlxml.dll天生XML文档时必要这类格局。Universal表关于编写代码的人来讲是通明的,但懂得这个表仍是很成心义的,它将有助于代码的开辟和调试。上面是Universal表的一个例子:
TagParentstore!1!idstore!1!namesale!2!ordernosale!2!qty
1NULL7066Barnum&single;sNULLNULL
217066Barnum&single;sA29765050
217066Barnum&single;sQA7442375
1NULL8042BookbeatNULLNULL
218042Bookbeat423LL92215
Universal表和EXPLICIT形式查询的元数据部分都以白色暗示,玄色暗示数据。对照查询和表就能够找出sqlxml.dll天生XML文档所必要的元素。我们来细心地剖析一下它们形貌的是甚么。
Tag和Parent列是XML文档条理布局方面的信息,我们能够以为中的每一个SELECT语句代表了一个XML节点,而Tag和Parent列让我们指定节点在文档条理布局中的地位。假如在第二个SELECT语句中指定Tag为2、指定Parent为1,就暗示为这些数据加上了一个值为2的标签,而这些数据的父亲是那些标签为1的数据(即第一个SELECT语句)。这就使得我们可以机关出<Store>和<Sale>之间的父-子干系,并且正如你大概料想到的,它使得我们能够天生恣意正当的XML文档布局。注重第一个SELECT命令的parent列设置成了NULL,这暗示<Store>元素处于最顶层的地位。
以玄色暗示的数据将成为节点的属性或元素,比方,Store_ID就经由过程列名供应了这方面的信息。列名字中的“!”是分开符,统共可分红四项(四个参数),个中第四个参数是可选的。这些参数形貌的是:
第一个参数形貌该列所属元素的名字,在这里是<Store>元素。
第二个是标签编号,它指定了该列信息在XML树形布局中所处地位。
第三个参数指定XML文档内的属性或元素名字。在这里名字指定为id。
数据列默许被创立为参数2所指定节点的属性,即id将成为<Store>节点的属性。假如要指定id是<Store>的一个子元素,我们可使用第四个可选的参数,这个参数的一个感化就是让我们把该项指定为元素,比方store!1!id!element。
因为利用了UNIONALL操纵符来保持SELECT语句,为了包管SQL查询的正当性,一切SELECT语句的选择了局必需具有不异数目的列。我们利用NULL关头词来补足SELECT语句,从而制止了反复数据。
经由过程EXPLICIT形式查询所天生的XML文档和经由过程AUTO形式天生的完整不异,那末为何要创立EXPLICIT形式查询呢?
假定如今有人请求在XML文档中包括商铺的打折信息。检察Pubs数据库,我们得知每一个商铺都能够有0到n局限内的扣头率。因而,一种公道的办法是在<Store>元素上面加上子元素<Discount>,如许我们就失掉以下XML文档布局:
<STORES>
<STOREId=&single;&single;Name=&single;&single;>
<DISCOUNTType=&single;&single;LowQty=&single;&single;HighQty=&single;&single;>
<AMOUNT></AMOUNT>
</DISCOUNT>
<SALEOrdNo=&single;&single;Qty=&single;&single;>
</SALE>
</STORE>
</STORES>
这里的修改包含:
要在<Sale>元素地点的条理增添一个XML元素<Discount>,即<Discount>是<Stroe>的子元素。
Amount嵌套在<Discount>内里,但不该该是<Discount>元素的属性。
在AUTO形式中是不成能完成这些修改的。
上面是创立这个新XML文档的EXPLICIT形式查询:
【A】
SELECT1asTag,NULLasParent,
s.stor_idas,
s.stor_nameas,
NULLas,
NULLas,
NULLas,
NULLas,
NULLas,
NULLas
FROMstoress
UNIONALL
SELECT2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty,
NULL,
NULL,
NULL,
NULL
FROMstoress,salessa
WHEREs.stor_id=sa.stor_id
UNIONALL
SELECT3,1,
NULL,
s.stor_name,
NULL,
NULL,
d.discounttype,
d.lowqty,
d.highqty,
d.discount
FROMstoress,discountsd
WHEREs.stor_id=d.stor_id
ORDERBY
ForXMLEXPLICIT
为了创立A所显现的EXPLICIT形式查询,我们对的查询举行了以下修正:
增添了第三个子查询提取扣头数据,经由过程Tag列声明这些数据的标签值为3。
经由过程指定Parent列为1将扣头数据设置成<Store>元素的子元素。
注重在第三个SELECT子查询中我们只包括了那些必须的列,并用NULL补足空列。这个子查询包括store_name列,固然Discount元素其实不要用到这个列,但假如把这个列也设置为NULL,则了局Universal表将不会依照剖析器所请求的那样以节点升序排序(无妨本人试一下看看)。Universal表的排序列也能够用Tag列替换。
为保持了局Universal表的完全性,第1、二两个SELECT语句也用NULL补足以反应为扣头数据增添的列。
为指定新扣头列的元数据修正了第一个SELECT语句。
经由过程在第四个参数中声明element指定Amount列为Discount的一个元素(element是可在第四个参数中声明的多个指令之一)。
上面这个XML文档只能用EXPLICIT形式天生:
了局XML文档中不会显现出NULL数据,如扣头lowqty和highqty。
看来下面的先容,人人大概已对FORXML的语法有所懂得。经由过程FORXML我们在可以在QueryAnalyzer中间接前往一个XML格局的数据大概经由过程其他多样化体现体例将XML格局的数据显现出来,好比能够将数据显现在扫瞄器上。上面这个例子就利用FORXML和ADO将数据输入到扫瞄器的例子。
DimadoConn
SetadoConn=Server.CreateObject("ADODB.Connection")
DimsConn
sConn="Provider=SQLOLEDB;DataSource=192.168.0.160;InitialCatalog=Northwind;UserID=SA;Password=;"
adoConn.ConnectionString=sConn
adoConn.CursorLocation=adUseClient
adoConn.Open
DimadoCmd
SetadoCmd=Server.CreateObject("ADODB.Command")
SetadoCmd.ActiveConnection=adoConn
DimsQuery
‘界说FORXML的查询。详细的语法在今后的章节中将具体先容。
sQuery="<ROOTxmlns:sql=urn:schemas-microsoft-com:xml-sql><sql:query>SELECT*FROMPRODUCTSORDERBYPRODUCTNAMEFORXMLAUTO</sql:query></ROOT>"
‘创建ADODBStream工具,ADODBStream工具必要ADO2.5以上版本撑持,它能够将纪录集转换为数据流。
DimadoStreamQuery
SetadoStreamQuery=Server.CreateObject("ADODB.Stream")
adoStreamQuery.Open
adoStreamQuery.WriteTextsQuery,adWriteChar
adoStreamQuery.Position=0
adoCmd.CommandStream=adoStreamQuery
adoCmd.Dialect="{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"
Response.write"PushingXMLtoclientforprocessing"&"<BR/>"
adoCmd.Properties("OutputStream")=Response
‘输入XML格局的文本
Response.write"<XMLID=MyDataIsle>"
adoCmd.Execute,,adExecuteStream
Response.write"</XML>"
‘经由过程IE的XML剖析器,利用DOM办法将XML的文本转换为HTML
EXPLICIT形式
EXPLICIT形式对照庞大,我们将用别的一种办法来表达所显现的查询。这类办法使得我们可以完整地把持查询所天生的XML文档。起首我们将先容怎样改用EXPLICIT形式编写所显现的查询,然后看看这类办法怎样付与我们远远凌驾AUTO形式的才能。
上面是查询用EXPLICIT形式表达的代码:
【】
--商铺数据
SELECT1asTag,
NULLasParent,
s.stor_idas,
s.stor_nameas,
NULLas,
NULLas
FROMstoress
UNIONALL
--发卖数据
SELECT2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty
FROMstoress,salessa
WHEREs.stor_id=sa.stor_id
ORDERBY
FORXMLEXPLICIT
这个查询初看起来有点庞大,实在它只是把分歧的数据集(即这里的Store和Sale)分化到了自力的SELECT语句里,然后再用UNIONALL操纵符保持成一个查询。
我们之以是要把查询写成下面的情势,是为了让查询了局不但包括XML文档所形貌的数据,并且还包括形貌XML文档布局的元数据。上述查询所天生的表称为Universal表,sqlxml.dll天生XML文档时必要这类格局。Universal表关于编写代码的人来讲是通明的,但懂得这个表仍是很成心义的,它将有助于代码的开辟和调试。上面是Universal表的一个例子:
TagParentstore!1!idstore!1!namesale!2!ordernosale!2!qty
1NULL7066Barnum&single;sNULLNULL
217066Barnum&single;sA29765050
217066Barnum&single;sQA7442375
1NULL8042BookbeatNULLNULL
218042Bookbeat423LL92215
Universal表和EXPLICIT形式查询的元数据部分都以白色暗示,玄色暗示数据。对照查询和表就能够找出sqlxml.dll天生XML文档所必要的元素。我们来细心地剖析一下它们形貌的是甚么。
Tag和Parent列是XML文档条理布局方面的信息,我们能够以为中的每一个SELECT语句代表了一个XML节点,而Tag和Parent列让我们指定节点在文档条理布局中的地位。假如在第二个SELECT语句中指定Tag为2、指定Parent为1,就暗示为这些数据加上了一个值为2的标签,而这些数据的父亲是那些标签为1的数据(即第一个SELECT语句)。这就使得我们可以机关出<Store>和<Sale>之间的父-子干系,并且正如你大概料想到的,它使得我们能够天生恣意正当的XML文档布局。注重第一个SELECT命令的parent列设置成了NULL,这暗示<Store>元素处于最顶层的地位。
以玄色暗示的数据将成为节点的属性或元素,比方,Store_ID就经由过程列名供应了这方面的信息。列名字中的“!”是分开符,统共可分红四项(四个参数),个中第四个参数是可选的。这些参数形貌的是:
第一个参数形貌该列所属元素的名字,在这里是<Store>元素。
第二个是标签编号,它指定了该列信息在XML树形布局中所处地位。
第三个参数指定XML文档内的属性或元素名字。在这里名字指定为id。
数据列默许被创立为参数2所指定节点的属性,即id将成为<Store>节点的属性。假如要指定id是<Store>的一个子元素,我们可使用第四个可选的参数,这个参数的一个感化就是让我们把该项指定为元素,比方store!1!id!element。
因为利用了UNIONALL操纵符来保持SELECT语句,为了包管SQL查询的正当性,一切SELECT语句的选择了局必需具有不异数目的列。我们利用NULL关头词来补足SELECT语句,从而制止了反复数据。
经由过程EXPLICIT形式查询所天生的XML文档和经由过程AUTO形式天生的完整不异,那末为何要创立EXPLICIT形式查询呢?
假定如今有人请求在XML文档中包括商铺的打折信息。检察Pubs数据库,我们得知每一个商铺都能够有0到n局限内的扣头率。因而,一种公道的办法是在<Store>元素上面加上子元素<Discount>,如许我们就失掉以下XML文档布局:
<STORES>
<STOREId=&single;&single;Name=&single;&single;>
<DISCOUNTType=&single;&single;LowQty=&single;&single;HighQty=&single;&single;>
<AMOUNT></AMOUNT>
</DISCOUNT>
<SALEOrdNo=&single;&single;Qty=&single;&single;>
</SALE>
</STORE>
</STORES>
这里的修改包含:
要在<Sale>元素地点的条理增添一个XML元素<Discount>,即<Discount>是<Stroe>的子元素。
Amount嵌套在<Discount>内里,但不该该是<Discount>元素的属性。
在AUTO形式中是不成能完成这些修改的。
上面是创立这个新XML文档的EXPLICIT形式查询:
【A】
SELECT1asTag,NULLasParent,
s.stor_idas,
s.stor_nameas,
NULLas,
NULLas,
NULLas,
NULLas,
NULLas,
NULLas
FROMstoress
UNIONALL
SELECT2,1,
s.stor_id,
s.stor_name,
sa.ord_num,
sa.qty,
NULL,
NULL,
NULL,
NULL
FROMstoress,salessa
WHEREs.stor_id=sa.stor_id
UNIONALL
SELECT3,1,
NULL,
s.stor_name,
NULL,
NULL,
d.discounttype,
d.lowqty,
d.highqty,
d.discount
FROMstoress,discountsd
WHEREs.stor_id=d.stor_id
ORDERBY
ForXMLEXPLICIT
为了创立A所显现的EXPLICIT形式查询,我们对的查询举行了以下修正:
增添了第三个子查询提取扣头数据,经由过程Tag列声明这些数据的标签值为3。
经由过程指定Parent列为1将扣头数据设置成<Store>元素的子元素。
注重在第三个SELECT子查询中我们只包括了那些必须的列,并用NULL补足空列。这个子查询包括store_name列,固然Discount元素其实不要用到这个列,但假如把这个列也设置为NULL,则了局Universal表将不会依照剖析器所请求的那样以节点升序排序(无妨本人试一下看看)。Universal表的排序列也能够用Tag列替换。
为保持了局Universal表的完全性,第1、二两个SELECT语句也用NULL补足以反应为扣头数据增添的列。
为指定新扣头列的元数据修正了第一个SELECT语句。
经由过程在第四个参数中声明element指定Amount列为Discount的一个元素(element是可在第四个参数中声明的多个指令之一)。
上面这个XML文档只能用EXPLICIT形式天生:
了局XML文档中不会显现出NULL数据,如扣头lowqty和highqty。
看来下面的先容,人人大概已对FORXML的语法有所懂得。经由过程FORXML我们在可以在QueryAnalyzer中间接前往一个XML格局的数据大概经由过程其他多样化体现体例将XML格局的数据显现出来,好比能够将数据显现在扫瞄器上。上面这个例子就利用FORXML和ADO将数据输入到扫瞄器的例子。
DimadoConn
SetadoConn=Server.CreateObject("ADODB.Connection")
DimsConn
sConn="Provider=SQLOLEDB;DataSource=192.168.0.160;InitialCatalog=Northwind;UserID=SA;Password=;"
adoConn.ConnectionString=sConn
adoConn.CursorLocation=adUseClient
adoConn.Open
DimadoCmd
SetadoCmd=Server.CreateObject("ADODB.Command")
SetadoCmd.ActiveConnection=adoConn
DimsQuery
‘界说FORXML的查询。详细的语法在今后的章节中将具体先容。
sQuery="<ROOTxmlns:sql=urn:schemas-microsoft-com:xml-sql><sql:query>SELECT*FROMPRODUCTSORDERBYPRODUCTNAMEFORXMLAUTO</sql:query></ROOT>"
‘创建ADODBStream工具,ADODBStream工具必要ADO2.5以上版本撑持,它能够将纪录集转换为数据流。
DimadoStreamQuery
SetadoStreamQuery=Server.CreateObject("ADODB.Stream")
adoStreamQuery.Open
adoStreamQuery.WriteTextsQuery,adWriteChar
adoStreamQuery.Position=0
adoCmd.CommandStream=adoStreamQuery
adoCmd.Dialect="{5D531CB2-E6Ed-11D2-B252-00C04F681B71}"
Response.write"PushingXMLtoclientforprocessing"&"<BR/>"
adoCmd.Properties("OutputStream")=Response
‘输入XML格局的文本
Response.write"<XMLID=MyDataIsle>"
adoCmd.Execute,,adExecuteStream
Response.write"</XML>"
‘经由过程IE的XML剖析器,利用DOM办法将XML的文本转换为HTML
刀兵之二:XPath
W3C于1999年10月8日提出的XPath言语标准,它是一种基于XML的查询言语,它能在XML文挡中处置数据。SQLServer2000中完成的是该标准的子集。它把table和views作为XML的组件,并把columns作为XML属性。SQLServer2000的XML撑持IIS利用URL大概模板的体例提交到SQLServer处置Xpath查询,并前往XML的了局。
撑持的功效
下表显现SQLServer2000中完成的XPath言语的功效。
功效项目轴attribute、child、parent和self轴包含一连谓词和嵌套谓词在内的布尔值谓词一切干系运算符=,!=,<,<=,>,>=算术运算符+,-,*,div显式转换函数number()、string()、Boolean()布尔运算符AND,OR布尔函数true()、false()、not()XPath变量
不撑持的功效
下表显现SQLServer2000中没有完成的XPath言语的功效。
功效项目轴ancestor、ancestor-or-self、descendant、descendant-or-self(//)、following、following-sibling、namespace、preceding、preceding-sibling数值谓词算术运算符mod节点函数ancestor、ancestor-or-self、descendant、descendant-or-self(//)、following、following-sibling、namespace、preceding、preceding-sibling字符串函数string()、concat()、starts-with()、contains()、substring-before()、substring-after()、substring()、string-length()、normalize()、translate()布尔函数lang()数字函数sum()、floor()、ceiling()、round()Union运算符|
XPath查询是以表达式的情势指定的。地位路径是一种对照经常使用表达式,用以选择相对高低文节点的节点集。地位路径表达式的求值了局是节点集。
XML文档
<root>
<orderproductid="Prod-28"unitprice="45.6"quantity="15">
<discount>0.25</discount>
</order>
<orderproductid="Prod-39"unitprice="18"quantity="21">
<discount>0.25</discount>
</order>
<orderproductid="Prod-46"unitprice="12"quantity="2">
<discount>0.25</discount>
</order>
</root>
上面是查询该XML文档的XPath地位路径表达式,它的寄义是前往根节点下一切<ROOT>子元素下的ProductID属性的属性值为"prod-39"的<order>元素。
地位路径的范例
能够分为相对地位路径和绝对地位路径。
相对地位路径以文档的根节点入手下手,由斜杠(/)构成,前面能够是绝对地位路径。斜杠(/)选定文档的根节点。
绝对地位路径以文档的高低文节点(Context)入手下手,由斜杠(/)所分隔的一个或多个地位步骤序列构成。每一个步骤都选定相对高低文节点的节点集。初始步骤序列选定相对高低文节点的节点集。节点会合的每一个节点都用作后续步骤的高低文节点。由后续步骤标识的节点集连接在一同。比方,child::Order/child::OrderDetail选定高低文节点的<order>子元素的<orderdetail>子元素。
地位步骤(相对或绝对)地位路径由包括上面三部分的地位步骤构成:
轴
轴指定地位步骤选定的节点与高低文节点之间的树干系。SQLServer2000撑持parent、child、attribute及self轴。
假如在地位路径中指定child轴,查询选定的一切节点都将是高低文节点的子节点。
好比说要查询从以后的高低文节点当选定一切<Order>节点的子节点,可使用child::Order
假如指定parent轴,选定的节点将是高低文节点的父节点。
好比说要查询从以后的高低文节点当选定一切<Order>节点的父节点,可使用parent::Order
假如指定attribute轴,选定的节点是高低文节点的属性。
好比说要查询从以后的高低文节点当选定一切<Order>节点的属性,可使用attribute::Order
节点测试
节点测试指定地位步骤选定的节点范例。每一个轴(child、parent、attribute和self)都具有次要节点范例。关于attribute轴,次要节点范例是<attribute>。关于parent、child和self轴,次要节点范例是<element>。
比方,假如地位路径指定child::Order,则将选定高低文节点的<Order>子元素。由于child轴以<element>为其次要节点范例,并且假如Order是<element>节点,则节点测试Order为TRUE。
选择谓词(零个或多个)
谓词环绕着轴选择节点集。在XPath表达式中指定选择谓词与在SELECT语句中指定WHERE子句类似。谓词在括号中指定。使用在选择谓词中指定的测试将对节点测试前往的节点举行选择。关于要选择的节点会合的每一个节点,在对谓词表达式取值时将此节点作为高低文节点,将节点会合的节点数作为高低文巨细。假如谓词表达式对此节点取值为TRUE,则此节点将包含在最初所失掉的节点会合。
比方:
1.Child::Order暗示从以后的高低文节点当选定ProductID属性值为Prod-39的一切<order>子节点。
2.Child::Order暗示从以后的高低文节点当选定包括一个或多个<Discount>子节点的一切<Order>子节点。
3.Child::Order暗示从以后的高低文节点当选定不包括<Discount>子节点的一切<Order>子节点。
地位步骤的语法
是用两个冒号(::)分隔的轴名和节点测试,前面是分离放在方括号中的零个或多个表达式。
比方,在XPath表达式(地位路径)child::Order中,选定高低文节点的一切<order>子元素。然后将谓词中的测试使用于节点集,将只前往ProductID属性的属性值为"prod-39"的<order>元素节点。
缩略语法
Sqlservr2000撑持上面的地位路径缩略语法:
attribute::能够缩略为@。
好比:能够缩写成[@ProductID="Prod-39"]
child::能够在地位步骤中省略。
好比:地位路径child::ROOT/child::Orde能够缩写成ROOT/Order
self::node()可缩略为一个句点(.),而parent::node()可缩略两个句点(..)。
以是/child::ROOT/child::Order也能够缩写成/ROOT/Order[@ProductID="prod-39"]
Merge将一定数量的MyISAM表联合而成一个整体,在超大规模数据存储时很有用 而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~ 我个人认为就是孜孜不懈的学习 如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。 换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的 无法深入到数据库系统层面去了解和探究 多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。 分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。 财务软件要用SQL也只是后台的数据库而已,软件都是成品的,当然多学东西肯定是有好处的..
页:
[1]