QUOTE:
不支持的特性和工作中的解决方案
目前SQL Server 2005中,XQuery不支持的特性如下:
• Let 语句:作为FLWOR表达式一部分的let语句,能为表达式的返回值绑定一个变量。解决方案-可以用inline表达式代替let语句使用。
• Range表达式(to操作符):Range表达式能够使用to操作符来构架自增的整数序列。比如,一个range表达式(6to10),它可以构架队列(6, 7, 8, 9, 10)。解决方案—你可以列出序列的所有值,以代替使用to操作符。
• 类型信息:目前还不支持基于类型系统的某些特性,如表达式typeswitch、treat as、 castable和validate。
• Typeswitch表达式类似与其它程序语言中的switch-case结构。在switch-case语句中,每个分支都是基于switch输入的条件的值;而在typeswitch表达式中,每个分支都是基于typeswitch输入的条件的类型。解决方案—使用if then else和instance of语句来代替。
• Treat as表达式能够将表达式返回的静态类型转换为指定的静态类型,并且当表达式的返回静态类型与指定静态类型不匹配时,会报一个静态类型错误。它不能转换表达式返回的动态类型或者值。解决方案—无。
• Castable表达式能够检查确认一个原子值是否可以转换为指定的类型。解决方案—使用表达式“empty(data($x)) or not(empty(T($x)))” 代替“$x castable as T?”。
• Validate表达式在目前范畴内,是把基于schema定义的条件有效化。解决方案—使用Transact-SQL转换schema collection,来替代使用validate表达式。
• 可重用性(Reusability):与其它程序语言一样,它可以编写可重用性的函数,和已知的用户自定义函数一样,包含可以调用和整合的查询。另外,它还可以把用户自定义的函数如模块的聚集进行打包。查询能够通过引入模块,调用模块中的函数。模块能够在查询的前缀部分进行引入。SQL Server 2005对这个特性没有解决方案。
• Built-in functions:目前在SQL Server 2005中,还不支持下面列举的内置函数。关于这些函数的更多内容,参见网站W3C.org的《XQuery 1.0和XPath 2.0的函数与操作符》(XQuery 1.0 and XPath 2.0 Functions and Operators)。
• 访问符(accessors):fn:node-name(), fn:nilled(), fn:base-uri(), fn:document-uri()。
• 错误函数(error function): fn:error().
• 跟踪函数(trace function): fn:trace().
• 数值函数(functions on numeric values): abs(), round-half-to-even()。
• 字符串处理函数(string-handling functions): codepoints-to-string(), string-to-codepoints(), compare(), string-join(), normalize-space(), normalize-unicode(), upper-case(), lower-case(), translate(), escape-uri(), starts-with(), ends-with(), substring-before(), substring-after(), matches(), replace(), tokenize()。
• 统一资源标识的函数和操作符(functions and operators for anyURI): resolve-uri()。
• 时间段、日期、时间的函数和操作符(functions and operators on durations, dates, and time): years-from-duration(), months-from-duration(), days-from-duration(), hours-from-duration(), minutes-from-duration(), seconds-from-duration(), year-from-dateTime(), month-from-dateTime(), month-from-dateTime(), day-from-dateTime(), hours-from-dateTime(), minutes-from-dateTime(), seconds-from-dateTime(), timezone-from-dateTime(), year-from-date(), month-from-date(), day-from-date(), timezone-from-date(), hours-from-time(), minutes-from-time(), seconds-from-time(), timezone-from-time(), adjust-dateTime-to-timezone(), adjust-date-to-timezone(), adjust-time-to-timezone(), subtract-dateTimes-yielding-yearMonthDuration(), subtract-dateTimes-yielding-dayTimeDuration(), subtract-dates-yielding-yearMonthDuration(), subtract-dates-yielding-dayTimeDuration(). 类型xdt:dayTimeDuration 和 xdt:yearMonthDuration也不支持。
• QNames相关函数(functions related to QNames): resolve-QName(), QName(), namespace-uri-for-prefix(), in-scope-prefixes()。
• 节点函数(functions on nodes): name(), lang(), root(). 解决方案–使用 of root()代替。
• 序列的函数和操作符(functions and operators on sequences): fn:boolean(), fn:index-of(), fn:exists(), insert-before(), remove(), reverse(), subsequence(), unordered(), zero-or-one(), one-or-more(), exactly-one(), deep-equal(),two-argument version of id(), idref(), doc(), collection()函数和集合, intersect和except 操作符。解决方案 – 使用not(not()) 代替fn:boolean(),使用 not(empty())代替fn:exists(). 使用重复说明代替zero-or-one(),使用[1]代替exactly-one()。
• 上下文函数(context functions): current-dateTime(), current-date(), current-time(), default-collation(), implicit-timezone()。
• 位置变量(positional variable):位置变量可以使用at语句定义为一个FLWOR语句中的某部分,它能够标识某表达式返回结果中的节点位置。
• 改变顺序(order):使用order by语句来改变“empty greatest | least”顺序是不支持的。
• 其它特征:下面的特征也不提供支持:
• Idiv操作符。
• 不支持从外部导入schema。
• 不支持外部变量。
• 不支持无边界的保存条件。
• 不支持不同类型序列的串联,如节点和数据。
• 不支持保存0时间。
• 不支持使用一个简单类型的内容来访问一个元素中的文本节点。
• 不支持在一个类型化XML数据类型应用中访问xsi:*属性。
最佳实践和指导方针
• 尽可能利用可以使用的类型的特点。它能够提高执行效率和通过静态类型来监测错误。
• 如果你想提取XML数据类型的部分属性并在关系性查询中使用它们,那么使用XQuery可以提高性能。通常,有用的属性都在关系性数据表中都作为索引保存,以提高性能。
• 使用递增定义,如[1]或者FLWOR来避免错误匹配基数而导致的静态错误。
• 使用外部转换来避免静态类型错误。
• 索引的使用:如果你要使用繁琐的XPath表达式来查询,就创建一个PATH索引。当XQuery查中的XPath表达式使用模糊路径(e.g., /a/* or //b)来查询元素或者属性时,就使用一个VALUE索引。当查询中包含对XML文档进行某已知属性的所有节点查询的时候,就使用PROPERTY索引。
• 当涉及的大部分类型都是同一个命名空间时,使用默认命名空间。或者,使用一个前缀。
最佳实践的更多内容,参见Microsoft Developer Network (MSDN)的《XML在微软SQL Server 2005上的最佳实践》(XML Best Practices for Microsoft SQL Server 2005)和《XML数据类型的最佳应用》(Performance Optimizations for the XML Data Type)
QUOTE:
XML数据的修改
SQL Server 2005支持对存储在数据库中的XML数据进行修改。目前,W3C XQuery工作草图还没有为XML文档的修改定义一个规范。为了提供修改XML文档的支持,微软研发了XML数据修改语言(XML Data Modification Language DML)。XML文档可以使用XML数据类型的modify方法修改,并且可以使用XML DML语句指定修改。
XML DML分别使用insert、 delete和 replace value of关键字对XML文档进行插入、删除和更新操作。一个类型化XML文档的修改是以根据对XML数据类型定义的schema约束进行的有效检查为前提的。
下面的表和XML文档举例说明了XML DML的操作:
表:
CREATE TABLE [CandidateInfoXMLDataType]
(
[JobCandidateID] [int] IDENTITY(1,1) NOT NULL,
[Resume] [xml] NOT NULL,
[ModifiedDate] [datetime] NOT NULL DEFAULT (getdate())
)
XML实例:
<JobCandidate>
<Name>
<FirstName>Mike</FirstName>
<MiddleName></MiddleName>
<LastName>Chen<