Aracılığıyla paylaş


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

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

Genellikle bu yöntem ayıklamak için bir değer saklanan bir xml örnek kullandığınız bir xml türü sütun, parametre veya değişken.Bu yolla birleştirebilir veya verileri olmayan xml sütun xml verileriyle karşılaştırmak seçim sorguları belirtebilirsiniz.

Sözdizimi

value (XQuery, SQLType)

Bağımsız değişkenler

  • XQuery
    İş XQueryifade, verileri xml örnekiçine alan bir dize ,. XQuery en fazla bir değer döndürmelidir.Aksi takdirde hata oluşur.

  • SQLType
    Döndürülecek tercih edilen SQL dize , türüdür.Bu yöntem dönüş türü eşleşen SQLType parametresi.SQLTypeolamaz bir xml veri türü, bir ortak dil çalışma zamanı (clr) kullanıcı tanımlı tür, image, text, ntext, veya sql_variant veri türü.SQLTypeSQL, kullanıcı tanımlı veri türü olabilir.

Value() yöntem kullanan Transact-SQL işleç örtük dönüştürme ve çalışırsa sonuç XQueryifadetipine karşılık gelen SQL tarafından belirtilen xsd türünden sıralanmış dize gösterimine dönüştürmek Transact-SQL dönüştürme. Dönüştürme türünü çevrim kuralları hakkında daha fazla bilgi için bkz: CAST ve CONVERT (Transact-SQL).

Not

Yerine performans nedenleriyle, value() yöntem kullanma bir ilişkisel değer karşılaştırmak için bir koşul exist() ile sql:sütun().Bu örnekte aşağıdaki d gösterilir.

Örnekler

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

Aşağıdaki örnekte, bir xml örnek bir değişkende saklanır xml türü.value()yöntem alır ProductIDöznitelik değeri xml. Değer sonra atandığı bir int değ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

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

Olmasına karşın sadece bir ProductID öznitelik xml örnek, statik yazım kuralları yol ifade tek döndürür açıkça belirtmenizi gerektirir.Bu nedenle, ek [1] yol ifadesonunda belirtilir.Statik yazma hakkında daha fazla bilgi için bkz: XQuery ve statik yazma.

B.Bir xml türü sütunbir değer almak için value() yöntem kullanarak

Karşı belirtilen aşağıdaki sorgu bir xml sütun yazın (CatalogDescription), AdventureWorks2008R2 veritabanı.Sorgu alır ProductModelIDöznitelik değerleri sütundepolanan her xml örnek .

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:

  • namespace Anahtar sözcüğü kullanılır tanımlayan bir ad alanı öneki.

  • Statik yazarak gereksinimleri, [1] yolifade sonuna eklenen value()yöntem açıkça göstermek olduğunuifade yolverir tek.

Bu kısmi bir sonucudur:

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

C.Bir xml türü sütundeğerleri almak için value() ve exist() yöntemleri kullanma

Aşağıdaki örnek, her ikisi de kullanarak gösterir value() yöntem ve exist() yöntem , xml veri türü.value()yöntem almak için kullanılan ProductModelIDöznitelik değerleri xml. exist()yöntem WHEREyan tümce tablosatırları süzmek için kullanılır.

Sorgu, ürün modeli kimliklerinden garanti bilgileri içeren xml örneklerini alır ( <Warranty> öğesi) özelliklerinden biri olarak.Koşul WHERE yan tümce kullanan exist() yöntem almak yalnızca satırları karşılanması bu koşul.

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:

  • CatalogDescriptionsütun olduğu yazılı xml sütun. Başka bir deyişle, kendisiyle ilişkilendirilmiş bir şema koleksiyon vardır.De XQuery giriş, ad alaný bildirim , daha sonra sorgu gövdesi içinde kullanılan önek tanımlamak için kullanılır.

  • exist()yöntem döndüren bir 1 (True), xml örnek içerdiğini gösterir <Warranty>alt öğe olarak özellikleri.

  • value()yöntem SELECTyan tümce sonra alır ProductModelIDöznitelik değerleri tamsayılar.

Bu kısmi bir sonucudur:

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

D.Exist() yöntem yerine value() yöntemkullanarak

Yerine performans nedenleriyle, value() yöntem kullanın, ilişkisel bir değerle karşılaştırmak için bir koşul 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

Bunu şu şekilde yazılabilir:

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