Aracılığıyla paylaş


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

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

XML'e karşı bir XQuery yapar ve SQL türü değerini döndürür. Bu yöntem skaler bir değer döndürür.

Genellikle bu yöntemi, xml tipi bir sütun, parametre veya değişkende saklanan bir XML örneğinden bir değer çıkarmak için kullanırsınız. Bu şekilde, XML verisini XML olmayan sütunlardaki verilerle birleştiren veya karşılaştıran sorgular belirleyebilirsiniz SELECT .

Sözdizimi

value ( XQuery , SQLType )

Arguments

XQuery

XML örneği içindeki verileri alan bir dizi literali olan XQuery ifadesi. XQuery en fazla bir değerde geri dönmelidir. Aksi takdirde bir hata döner.

SQLType

Tercih edilen SQL türü, bir string literal, geri dönecek. Bu yöntemin dönüş türü SQLType parametresiyle eşleşir. SQLType, kullanıcı tarafından tanımlanan bir SQL veri türü olabilir.

Uyarı

SQLType aşağıdaki veri türlerinden biri olamaz: xml, image, text, ntext, sql_variant veya ortak dil çalışma zamanı (CLR) kullanıcı tanımlı bir tür.

Yöntem value() Transact-SQL CONVERT operatörünü örtük olarak kullanır. value() XQuery ifadesinin sonucunu, yani serileştirilmiş dizi temsilini, XML Şema Tanımı (XSD) tipinden dönüşümle belirtilen karşılık gelen SQL tipine dönüştürmeye Transact-SQL çalışır. Tip CONVERTdöküm kuralları hakkında daha fazla bilgi için bkz. CAST ve CONVERT.

Performans nedenleriyle, exist() bir önermede metod yerine ile sql:column()value() (ile kullanabilirsiniz) ve ilişkisel bir değerle karşılaştırabilirsiniz. Bu exist() örnek bu makalenin ilerleyen bölümlerinde gösterilmiştir.

Örnekler

Bu makaledeki kod örnekleri, AdventureWorks2025 giriş sayfasından indirebileceğiniz AdventureWorksDW2025 veya örnek veritabanını kullanır.

A. value() yöntemini bir XML tipi değişkene karşı kullanın

Aşağıdaki örnekte, bir XML örneği xml tipinde bir değişkende saklanır. Metod, value() öznitelik değerini XML'den alır ProductID . Değer daha sonra bir int değişkenine atanır.

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;

Sonuç olarak bir değer 1 döndürülür.

XML örneğinde yalnızca bir ProductID öznitelik olmasına rağmen, statik tipleme kuralları yol ifadesinin tekli bir atır döndürdüğünü açıkça belirtmenizi gerektirir. Bu nedenle, yol ifadesinin sonuna eklenir [1] . Statik yazı ile ilgili daha fazla bilgi için XQuery ve Static Typing bölümlerine bakınız.

B. XML tipi bir sütundan tam sayı değeri almak için value() yöntemini kullanın

Aşağıdaki sorgu, veritabanındaki CatalogDescription tipi bir sütuna (AdventureWorks2025) karşı belirtilmiştir. Sorgu, sütunda depolanan her XML örneğinden öznitelik değerlerini alır ProductModelID .

SELECT CatalogDescription.value(
    'declare namespace PD="http://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 not:

  • Anahtar kelime, namespace bir isim alanı önekini tanımlamak için kullanılır.

  • Statik tipleme gereksinimlerine göre, [1] yol ifadesinin value() sonunda yöntemin sonunda eklenir ve yol ifadesinin tekli bir döndürücü olduğunu açıkça belirtir.

Sonuç kümesi aşağıdadır.

35
34
28
25
23
19

C. XML tipi bir sütundan bir dizi değeri almak için value() yöntemini kullanın

Aşağıdaki sorgu, veritabanındaki CatalogDescription tipi sütununa (AdventureWorks2025) karşı belirtilmiştir. Sorgu, sütunda depolanan her XML örneğinden öznitelik değerlerini alır ProductModelName .

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

Önceki sorgudan not:

  • Anahtar kelime, namespace bir isim alanı önekini tanımlamak için kullanılır.

  • Statik tipleme gereksinimlerine göre, [1] yol ifadesinin value() sonunda yöntemin sonunda eklenir ve yol ifadesinin tekli bir döndürücü olduğunu açıkça belirtir.

Sonuç kümesi aşağıdadır.

Touring-2000
Touring-1000
Road-450
Road-150
Mountain-500
Mountain 100

D. XML tipi bir sütundan değerleri almak için value() ve exist() yöntemlerini kullanın

Aşağıdaki örnek, value() veri tipinin hem yönteminin hem de exist() yönteminin kullanıldığını göstermektedir. Bu value() yöntem, XML'den öznitelik değerlerini almak ProductModelID için kullanılır. Maddedeki exist() yöntem, WHERE tablodaki satırları filtrelemek için kullanılır.

Sorgu, garanti bilgisini ( <Warranty> elemanı) özelliklerden biri olarak içeren XML örneklerinden ürün model kimliklerini alır. Maddedeki WHERE koşul, yalnızca bu koşulu karşılayan satırları almak için yöntemi kullanır exist() .

SELECT CatalogDescription.value(
    'declare namespace PD="http://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="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";

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

Önceki sorgudan not:

  • Sütun, CatalogDescription tiplenmiş bir XML sütunudur. Bu, kendisiyle ilişkili bir şema koleksiyonu olduğu anlamına gelir. Modüller ve Prologlar - XQuery Prolog'da, isim alanı bildirmesi, sorgu gövdesinde daha sonra kullanılan öneki tanımlamak için kullanılır.

  • Eğer yöntem exist() dönerse 1 (doğru), XML örneğinin özelliklerden biri olarak alt öğeyi içerdiğini <Warranty> gösterir.

  • Maddedeki value() yöntemSELECT, öznitelik değerlerini tam sayı olarak alırProductModelID.

Kısmi sonuç aşağıdadır:

19
23
...

E. value() yöntemi yerine exist() yöntemini kullanın

Performans nedenleriyle, yöntemi value() ilişkisel bir değerle karşılaştırmak için bir önlemde kullanmak yerine, ile ile exist()kullanınsql:column(). Örneğin:

CREATE TABLE T (c1 INT, c2 VARCHAR(10), c3 XML);
GO

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

Bu kod aşağıdaki şekilde yeniden yazılabilir:

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