Share via


value() yöntemi (xml veri türü)

Bir XQuery karşı xml gerçekleştirir ve sql türünde bir değer döndürür. Bu yöntem, skalar bir değer döndürür.

Genellikle xml örneği depolanan değeri ayıklamak için bu yöntemi kullanın bir xmltürü sütun, parametre veya değişken. Bu şekilde, birleştiren veya verileri olmayan xml sütun xml verileriyle compare seçme sorguları belirtebilirsiniz.

Sözdizimi

value (XQuery, SQLType)

Bağımsız değişkenler

  • XQuery
    İse XQueryifade, verileri xml örneğinin içine alan bir dize,. XQuery en bir değer döndürmesi gerekir. Aksi takdirde hata oluşur.

  • SQLType
    Döndürülecek tercih sql türü, bir dize, değil. Bu yöntemin dönüş türü eşleşen SQLTypeparametresi. SQLTypeolamaz bir xmlveri türü, bir ortak dil çalışma zamanı (clr) kullanıcı tanımlı türü, image, text, ntext, ya sql_variantveri türü. SQLTypebir sql kullanıcı tanımlı veri türü olabilir.

Value() yöntemi kullanan Transact-SQLoperatör örtük dönüştürme ve sonucu XQuery ifade, xsd türü için belirtilen karşılık gelen sql türü seri hale getirilmiş dize gösterimine dönüştürmek için çalışır Transact-SQLDönüşüm. Dönüştürme türünü döküm kuralları hakkında daha fazla bilgi için bkz: CAST ve CONVERT (Transact-SQL).

[!NOT]

Performans nedenleriyle, yerine value() bir ilişkisel değer, kullanım karşılaştırmak için bir doğrulama yöntemi exist() ile sql:column(). Bu d aşağıdaki örnekte gösterilmiştir.

Örnekler

A.Bir xml türü değişkeni karşı value() yöntemini kullanarak

Aşağıdaki örnek, bir xml örneği bir değişken depolanan xmltürü. value()Yöntemi alır ProductIDöznitelik değeri XML'den. Değeri sonra atanan bir intdeğişkeni.

DECLARE @myDoc xml
DECLARE @ProdID int
SET @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'

SET @ProdID =  @myDoc.value('(/Root/ProductDescription/@ProductID)[1]', 'int' )
SELECT @ProdID

DECLARE @myDoc xml
DECLARE @ProdID int
SET @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
  <Warranty>1 year parts and labor</Warranty>
  <Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'

SET @ProdID =  @myDoc.value('(/Root/ProductDescription/@ProductID)[1]', 'int' )
SELECT @ProdID

1 Değeri sonuç olarak döndürülür.

Her ne kadar sadece bir ProductIDözniteliği xml örneği, statik yazma kuralları yol ifadesi tek verdiğini açıkça belirtmek gereklidir. Bu nedenle, ek [1]yol ifadesi sonunda belirtilir. Statik yazma hakkında daha fazla bilgi için bkz: XQuery ve statik yazma.

B.Xml türü sütundan bir değer almak için value() yöntemini kullanarak

Karşı belirtilen aşağıdaki sorgu bir xmltürü sütun (CatalogDescription) olarak AdventureWorksveritabanı. Sorgu alır ProductModelIDsütunda depolanan xml örneğinden özniteliği değerleri.

SELECT CatalogDescription.value('           
    declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";           
       (/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result           
FROM Production.ProductModel           
WHERE CatalogDescription IS NOT NULL           
ORDER BY Result desc           
SELECT CatalogDescription.value('           
    declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";           
       (/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result           
FROM Production.ProductModel           
WHERE CatalogDescription IS NOT NULL           
ORDER BY Result desc           

Önceki sorgudan aşağıdakilere dikkat edin:

  • namespaceAnahtar kelime, ad alanı önekini tanımlamak için kullanılır.

  • Statik yazarak gereksinimleri, [1]yol ifadesi sonuna eklenen value()yol ifadesi tek verdiğini açıkça belirtmek için yöntem.

Bu kısmi bir sonucudur:

-----------
35         
34         
...

-----------
35         
34         
...

C.Xml türü sütundan değerleri almak için value() ve exist() yöntemleri kullanarak

Aşağıdaki örnek gösterir hem de kullanarak value()yöntemi ve exist() yöntemi , xmlveri türü. value()Almak için kullanılan yöntem ProductModelIDöznitelik değerleri XML'den. exist()Yöntemi WHEREyan tümcesi tablodaki satırları süzmek için kullanılır.

Sorgu ürün modeli kimliklerini garanti bilgileri içeren xml örneklerini alır ( <Warranty> öğesi) gibi özelliklerden biri. Durumda WHEREyan exist()bu koşula uyan satırları almak için yöntem.

SELECT CatalogDescription.value('
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
           (/PD:ProductDescription/@ProductModelID)[1] ', 'int') as Result
FROM  Production.ProductModel
WHERE CatalogDescription.exist('
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";

     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1

SELECT CatalogDescription.value('
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
           (/PD:ProductDescription/@ProductModelID)[1] ', 'int') as Result
FROM  Production.ProductModel
WHERE CatalogDescription.exist('
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";

     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1

Önceki sorgudan aşağıdakilere dikkat edin:

  • CatalogDescriptionYazılı xml sütun sütundur. Bu o ilişkilendirilmiş şema koleksiyonu var demektir. İçinde XQuery giriş, ad alanı bildirimi, daha sonra sorgu gövdesi içinde kullanılan önek tanımlamak için kullanılır.

  • Eğer exist()yöntemi döner bir 1Bu xml örneği içerdiğini belirtir (True) <Warranty>alt öğe bir özellik olarak.

  • value()Yöntemi SELECTyan tümcesi sonra alır ProductModelIDöznitelik değerleri tamsayılar olarak.

Bu kısmi bir sonucudur:

Result     
-----------
19         
23         
...

Result     
-----------
19         
23         
...

D.Exist() yöntemi yerine value() yöntemini kullanarak

Performans nedenleriyle, yerine value()ilişkisel bir değerle karşılaştırmak için kullanın yüklemi yönteminde exist()ile sql:column(). Örneğin:

CREATE TABLE T (c1 int, c2 varchar(10), c3 xml)
GO

SELECT c1, c2, c3 
FROM T
WHERE c3.value( '/root[1]/@a', 'integer') = c1
GO

CREATE TABLE T (c1 int, c2 varchar(10), c3 xml)
GO

SELECT c1, c2, c3 
FROM T
WHERE c3.value( '/root[1]/@a', 'integer') = c1
GO

Bunu şu şekilde yazılabilir:

SELECT c1, c2, c3 
FROM T
WHERE c3.exist( '/root[@a=sql:column("c1")]') = 1
GO

SELECT c1, c2, c3 
FROM T
WHERE c3.exist( '/root[@a=sql:column("c1")]') = 1
GO

Ayrıca bkz.

Kavramlar

İle sorguları WITH xmlnamespaces NameSpaces eklemek

Yazılı xml yazılmamış xml karşılaştırın

xml veri örnekleri oluşturma

xml veri değişikliği dili (xml dml)

Diğer Kaynaklar

XML veri türü yöntemleri