T-SqlXml データを操作する
1. はじめに
SQL Server 2005 では、XML と呼ばれるネイティブ データ型が導入されました。ユーザーは、リレーショナル列に加えて、XML 型の列を 1 つ以上含むテーブルを作成できます。また、変数とパラメーターも使用できます。ドキュメントの順序や再帰構造などの XML モデル機能をより適切にサポートするために、XML 値はラージ バイナリ オブジェクト (BLOB) として内部形式で保存されます。
ユーザーが XML データをデータベースに保存する場合、SQL Server はその文字列を XML 型に自動的に変換してデータベースに保存します。
SQL Server は XML フィールドをサポートしているため、T-SQL ステートメントは、SQL Server での XML フィールドの使用を調整するための多数の XML 操作関数も提供します。この記事では主に、SQL ステートメントを使用して XML を操作する方法について説明します。
2. XML フィールドを定義する
データベース設計中に、テーブル デザイナーでフィールドを XML タイプとして簡単に定義できます。 XML フィールドは主キーまたはインデックス キーとして使用できないことに注意してください。同様に、SQL ステートメントを使用して、XML フィールドを使用してデータ テーブルを作成することもできます。次のステートメントは、整数の主キー "pk" と型なしの XML 列 "xCol" を持つ "docs" という名前のテーブルを作成します。 XML 型はテーブルで使用されますが、ストアド プロシージャ、トランザクション、関数などでも使用できます。 SQL ステートメントを使用して XML タイプのデータを定義し、それに値を割り当てて、XML 操作の最初のステップを完了しましょう:
CREATE TABLE docs (pk INT PRIMARY KEY, xCol XML not null)
XML タイプのデータを定義した後、最も一般的なのは使用されるのはクエリ操作です。SQL ステートメントを使用してクエリ操作を実行する方法を紹介します。
T-Sqlでは、XML型データをクエリする関数としてquery(xquery)とvalue(xquery, dataType)の2つが用意されており、このうちquery(xquery)はラベル付きのデータを取得し、value(xquery, dataType)は取得します。タグの内容。次のクラスでは、これら 2 つの関数を使用してクエリを実行します。
1、クエリには query(xquery) を使用します 本のタイトルを取得する必要があります。クエリには query(xquery) を使用します。クエリ ステートメントは次のとおりです:
declare @xmlDoc xml; set @xmlDoc='<book id="0001"> <title>C Program</title> <author>David</author> <price>21</price> </book>'
実行結果は次のとおりです。図:
、value(xquery, dataType) を使用してクエリを実行します は、本のタイトルを取得することもできます。 value 関数を使用する場合、1 つは 2 つのパラメーターを指定する必要があります。 xquery、もう 1 つは取得するデータのタイプです。次のクエリ ステートメントを見てください:
select @xmlDoc.query('/book/title')
実行結果は図に示すとおりです:
、クエリ属性値 クエリまたは値のどちらを使用しても、簡単に属性を取得できます。たとえば、実際には book ノードの ID を取得したいと考えています。ステートメントは次のとおりです。
select @xmlDoc.value('(/book/title)[1]', 'nvarchar(max)')
実行結果は次の図のようになります。
4
select @xmlDoc.value('(/book/@id)[1]', 'nvarchar(max)')--ID 0002 の book ノードを取得します
set @xmlDoc='<root> <book id="0001"> <title>C# Program</title> <author>Jerry</author> <price>50</price> </book> <book id="0002"> <title>Java Program</title> <author>Tom</author> <price>49</price> </book> </root>'上記のステートメントは独立して実行でき、ID 0002 のノードを取得します。実行結果は次のとおりです。
4. 変更操作
SQL 変更操作には、更新と削除が含まれます。 SQL には、Xml を変更するための modify() メソッドが用意されています。変更メソッドのパラメータは XML 変更言語です。 XML 変更言語は SQL の Insert、Delete、UpDate に似ていますが、同じではありません。
1、ノード値を変更します
ID 0001 の本の価格を 100 に変更したい場合は、modify メソッドを使用できます。コードは次のとおりです。select @xmlDoc.query('(/root/book[@id="0002"])')注: 変更メソッドは set の後に指定する必要があります。実行結果は図に示すとおりです。 2、ノードを削除します 次に、ID 0002 のノードを削除します。コードは次のとおりです。
set @xmlDoc.modify('replace value of (/root/book[@id=0001]/price/text())[1] with "100"') --得到id为0001的book节点 select @xmlDoc.query('(/root/book[@id="0001"])')実行結果は次のとおりです。
3、添加节点
很多时候,我们还需要向xml里面添加节点,这个时候我们一样需要使用modify方法。下面我们就向id为0001的book节点中添加一个ISBN节点,代码如下:
--添加节点
set @xmlDoc.modify('insert <isbn>78-596-134</isbn> before (/root/book[@id=0001]/price)[1]') select @xmlDoc.query('(/root/book[@id="0001"]/isbn)')
运行结果如图:
4、添加和删除属性
当你学会对节点的操作以后,你会发现,很多时候,我们需要对节点进行操作。这个时候我们依然使用modify方法,例如,向id为0001的book节点中添加一个date属性,用来存储出版时间。代码如下:
--添加属性
set @xmlDoc.modify('insert attribute date{"2008-11-27"} into (/root/book[@id=0001])[1]') select @xmlDoc.query('(/root/book[@id="0001"])')
运行结果如图:
如果你想同时向一个节点添加多个属性,你可以使用一个属性的集合来实现,属性的集合可以写成:(attribute date{"2008-11-27"}, attribute year{"2008"}),你还可以添加更多。这里就不再举例了。
5、删除属性
删除一个属性,例如删除id为0001 的book节点的id属性,我们可以使用如下代码:
--删除属性
set @xmlDoc.modify('delete root/book[@id="0001"]/@id') select @xmlDoc.query('(/root/book)[1]')
运行结果如图:
6、修改属性
修改属性值也是很常用的,例如把id为0001的book节点的id属性修改为0005,我们可以使用如下代码:
--修改属性
set @xmlDoc.modify('replace value of (root/book[@id="0001"]/@id)[1] with "0005"') select @xmlDoc.query('(/root/book)[1]')
运行结果如图:
OK,经过上面的学习,相信你已经可以很好的在SQL中使用Xml类型了,下面是我们没有提到的,你可以去其它地方查阅:exist()方法,用来判断指定的节点是否存在,返回值为true或false; nodes()方法,用来把一组由一个查询返回的节点转换成一个类似于结果集的表中的一组记录行。
以上がXMLフィールドに対するSQL操作のサンプルコードの詳細説明(図)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。