Aracılığıyla paylaş


Value() Yöntem (xml veri türü)

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

Genellikle bu yöntem tarafından depolanan bir XML örnek bir değer ayıklamak için kullandığınız bir xml sütun, parametre veya değişken yazın. Bu yolla, SELECT sorgularını birleştirmek veya XML verileri olmayan XML sütundaki verileri karşılaştırmak belirtebilirsiniz.

value (XQuery, SQLType)

Bağımsız değişkenler

  • XQuery
    Iş XQuery XML örnek içinde veri alan ifade, bir dize. XQuery en fazla bir değer döndürmelidir.Aksi halde bir hata döndürdü.

  • SQLType
    Döndürülecek tercih edilen SQL, dize, türüdür.The return type of this method matches the SQLType parameter.SQLType cannot be an xml data type, a common language runtime (CLR) user-defined type, image, text, ntext, or sql_variant data type.SQLType can be an SQL, user-defined data type.

The value() yöntem uses the Transact-SQL CONVERT işleç implicitly and tries to convert the result of the XQuery ifade, the serialized dize representation, from XSD type to the corresponding SQL type specified by Transact-SQL conversion. CONVERT türü çevrim kuralları hakkında daha fazla bilgi için bkz: CAST ve CONVERT (Transact-SQL).

Not

Yerine, performansı artırmak için Value() kullanmak ilişkisel bir değerle karşılaştırmak için bir doğrulama yöntemEXIST() with SQL:sütun().Bu, D, aşağıdaki örnekte gösterilmiştir.

Örnekler

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

Aşağıdaki örnekte, bir değişken bir XML örnek depolanır. xml yazın. The value() yöntem retrieves the ProductID öznitelik value from the XML. Değer sonra atanmış bir int değişken.

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öner.

Yok, ancak yalnızca bir ProductID örnek XML özniteliği statik yazarak açıkça belirtmek gerekli kuralları yol tek deyim döndürür. Bu nedenle, ek [1] Belirtilen yolun sonundaki ifade. Statik olarak yazma hakkında daha fazla bilgi için bkz: XQuery ve statik yazma.

b.Bir xml türünden bir değer almak için value() yöntem kullanarak sütun

Aşağıdaki sorgu karşı belirtilen bir xml sütun () yazın.CatalogDescription) içinde AdventureWorks Veritabanı. Sorgu alır. ProductModelID öznitelik değerleri depolanan her XML örneknden sütun.

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:

  • The namespace keyword is used to define a namespace prefix.

  • Statik yazım gereksinimleri [1] Yol ifadesinde sonuna eklenen value() açıkça yol ifadesi tek döndürmesidir belirtmek için yöntem.

Bu kısmi kaynaklanır:

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

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

Aşağıdaki örnek, her ikisini birden kullanarak gösterir value() yöntem ve EXIST() yöntemi of the xml veri türü. The value() yöntem is used to retrieve ProductModelID öznitelik values from the XML. The exist() yöntem in the WHERE yan tümce is used to filter the rows from the tablo.

Sorgu, ürün modeli kimliklerinden garanti bilgileri (içeren XML örneklerden alır. <Warranty> öğe) olarak özelliklerinden. Koşulda WHERE yan tümce kullanan exist() yalnızca bu koşul karşılanması satırları olarak 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

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

  • The CatalogDescription sütun is a typed XML sütun. Bu durum, kendisiyle ilişkili bir şema koleksiyon sahip olduğu anlamına gelir.Içinde XQuery giriş, ad alanı bildirim, daha sonra sorgu metninde kullanılan önek tanımlamak için kullanılır.

  • If the exist() yöntem returns a 1 (True), it indicates that the XML örnek includes the <Warranty> alt element as one of the features.

  • The value() yöntem in the SELECT yan tümce then retrieves the ProductModelID öznitelik values as integers.

Bu kısmi kaynaklanır:

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

d.Exist() yöntem yerine value() yöntem kullanarak

Yerine, performansı artırmak için value() ilişkisel bir değer, kullanım karşılaştırmak için bir doğrulama yöntem 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

Bu, aşağıdaki gibi yazılabilir:

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