仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 680|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网页设计SQL Server中读取XML文件的复杂做法

[复制链接]
透明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:21:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
在执行崩溃恢复时,理解在一个数据库中的每一个表tbl_name对应的在数据库目录中的3个文件是很重要的: SQLServer2000使得以XML导出数据变得加倍复杂,但在SQLServer2000中导进XML数据并对其举行处置则有些贫苦。  假如你参考BooksOnline(BOL),你会发明有相干的条目,包含OPENXML和OPENROWSET。一切的这些例子都撑持将XML文本作为已声明的变量,这关于常常处置文本的用户来讲十分便利,但关于但愿在开辟中读取XML文件并举行响应处置的开辟职员来讲就不是如许了。处置如许的成绩,也许最好从内到外来对其举行剖析。
  OPENXML是一个rowset函数(即前往一个rowset),它的事情体例相似于rowset函数OPENQUERY和OPENROWSET。利用OPENXML能够对XML数据实行JOINs操纵而无需起首导进数据。你还能够将其同INSERT、SELECT、UPDATE和DELETE等操纵团结利用。
  但是,要利用OPENXML,你必需实行两项OPENQUERY和OPENROWSET其实不必要的义务。这两项义务必要两个体系存储历程。
  第一个是sp_xml_preparedocument,它将读取特定的XML文本并将其内容提取到内存中。其语法以下:

sp_xml_preparedocument@hdoc=OUTPUT,
[,@xmltext=]
[,@xpath_namespaces=
  详细参数以下:
  @hdoc:指向某内存地区的句柄(从感化上看同等于一个指针),相干数据寄存在这里。注重这是一个输入变量,当该历程运转后,该变量将包括指向XML文件内容在内存地点的句柄。因为你必要在随后利用此了局,因而要确保对其举行保留;
  @xmltext:实践上你所但愿处置的XML文本;
  @xml_namespaces:为了一般操纵你的XML数据所必要的任何名字空间索引(namespacereferences)。注重在这里呈现的任何URL都必要用尖括号()括起来;

  假定所传送的这些参数都无效,而且XML文档存在,那末你的XML数据就会被寄存到内存中往。如今你就能够挪用sp_xml_preparedocument,传送寄存有XML文件的变量,然后实行OPENXML。语法以下:
OPENXML(idocint[in],rowpatternnvarchar[in],[flagsbyte[in]])
[WITH(SchemaDeclaration|TableName)]
  注重:在本文中没有充足的笔墨来形貌OPENXML所吸收的参数。请参阅BOL以猎取更多信息。在Transact-SQLReference中查找OPENXML。
  如今我们已抵达了最初的步骤。一切剩下的事情就是导进一个实践的XML文件到SQL并举行处置(很奇快为何一切的BOL示例都没有触及到这一关头的部分)。
  (我必需感激我的同事BillyPang所赐与的匡助。他匡助我办理这个成绩,并给出了代码――只管出于本文必要我对代码举行了扩充。感谢Billy!)
  基础的技能是,将文件逐行按文本读取。然后把一切读取的行毗连为一个年夜的VARCHAR变量。最初,将变量传送给后面所说的代码。
  以下就是读取文件并将其内容寄存到某变量的代码:
DECLARE@FileNamevarchar(255)
DECLARE@ExecCmdVARCHAR(255)
DECLARE@yINT
DECLARE@xINT
DECLARE@FileContentsVARCHAR(8000)
CREATETABLE#tempXML(PKINTNOTNULLIDENTITY(1,1),ThisLineVARCHAR(255))
SET@FileName=C:TempCurrentSettings.xml
SET@ExecCmd=type+@FileName
SET@FileContents=
INSERTINTO#tempXMLEXECmaster.dbo.xp_cmdshell@ExecCmd
SELECT@y=count(*)from#tempXML
SET@x=0
WHILE@x@y
BEGIN
SET@x=@x+1
SELECT@FileContents=@FileContents+ThisLinefrom#tempXMLWHEREPK
=@x
END
SELECT@FileContentsasFileContents
DROPTABLE#tempXML
  如今在变量@FileContents变量中你已取得了文件的全体内容。所必要做的只是将变量经由过程@xmltext参数传送给sp_xml_preparedocument,然后再挪用OPENXML。
  有了这类办理举措,对XML文档举行各类处置就成了大概。你能够将XML文档同SQL表格毗连在一同而无需导进数据,然后对这些数据举行INSERT、PDATE和DELETE等任何操纵。
有了rowbase的binlog后,我们来分析一下怎么实现闪回。平时的DML无非三种操作,增删改,先说三种操作的日志格式。
蒙在股里 该用户已被删除
沙发
发表于 2015-1-19 09:22:51 来自手机 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
若天明 该用户已被删除
板凳
发表于 2015-1-25 13:49:45 | 只看该作者
入门没那么困难,精通没那么容易
地板
发表于 2015-2-2 22:19:13 | 只看该作者
我们学到了什么?思考问题的时候从表的角度来思考问
再现理想 该用户已被删除
5#
发表于 2015-2-8 14:06:49 | 只看该作者
很多书籍啊,不过个人认为看书太慢,还不如自己学。多做实际的东西,就会遇到很多问题,网上搜下解决问题。不断重复这个过程,在配合sql的F1功能。
深爱那片海 该用户已被删除
6#
发表于 2015-2-25 18:09:26 | 只看该作者
原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!
山那边是海 该用户已被删除
7#
发表于 2015-3-8 00:53:19 | 只看该作者
一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)
第二个灵魂 该用户已被删除
8#
发表于 2015-3-15 18:57:11 | 只看该作者
两个月啃那本sqlserver2005技术内部-存储引擎,花了几个月啃四本书
小魔女 该用户已被删除
9#
发表于 2015-3-22 03:10:13 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 09:22

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表