Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft 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,
namespacebir isim alanı önekini tanımlamak için kullanılır.Statik tipleme gereksinimlerine göre,
[1]yol ifadesininvalue()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,
namespacebir isim alanı önekini tanımlamak için kullanılır.Statik tipleme gereksinimlerine göre,
[1]yol ifadesininvalue()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,
CatalogDescriptiontiplenmiş 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önerse1(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
İlgili içerik
- WITH XMLNAMESPACES kullanarak sorgulara ad alanları ekleme
- Yazılan XML ile yazılmamış XML karşılaştırma
- XML veri örnekleri oluşturun
- xml Veri Türü Yöntemleri
- XML Veri Değiştirme Dili (XML DML)