Aracılığıyla paylaş


sql:limit-field ve sql:limit-value (SQLXML 4.0) kullanılarak değerleri filtreleme

Şunlar için geçerlidir:SQL ServerAzure SQL Veritabanı

Veritabanı sorgusundan döndürülen satırları, bazı sınırlayıcı değerlere göre sınırlayabilirsiniz. sql:limit-field ve sql:limit-value annotasyonları, sınırlayıcı değerleri içeren veritabanı sütununu tanımlamak ve geri dönen verileri filtrelemek için kullanılacak belirli bir sınırlama değerini belirtmek için kullanılır.

sql:limit alanı açıklaması, sınırlayıcı değer içeren bir sütunu tanımlamak için kullanılır; her eşlenen eleman veya öznitelikte bu izinlidir.

sql:limit-değer açıklaması, sql:limit alan açıklamasında belirtilen sütundaki sınırlı değeri belirtmek için kullanılır. sql:limit-değer açıklaması isteğe bağlıdır. sql:limit-değeri belirtilmemişse, NULL değeri varsayılır.

Uyarı

SQL sütunu gerçek tipte olan bir sql:limit alanı ile çalışırken, SQLXML 4.0, XML şemalarında belirtilen sql:limit değerindenvarchar tarafından belirlenen bir değer olarak dönüşüm gerçekleştirir. Bu, ondalık sınır değerlerinin tam bilimsel gösterimle belirtilmesini gerektirir. Daha fazla bilgi için aşağıdaki Örnek B'ye bakınız.

Örnekler

Bu örneklerle çalışma örnekleri oluşturmak için aşağıdakilerin kurulu olması gerekir:

  • Microsoft SQL Server Yerel İstemcisi

  • MDAC 2.6 veya daha yeni sürümler

Bu örneklerde, şablonlar XSD eşleme şemasına karşı XPath sorgularını belirtmek için kullanılır.

A. Geri dönen müşteri adreslerinin belirli bir adres türüne sınırlandırılması

Bu örnekte, bir veritabanı iki tablo içerir:

  • Müşteri (CustomerID, Şirket Adı)

  • Adresler (CustomerID, AddressType, StreetAddress)

Bir müşterinin bir gönderim adresi ve/veya faturalama adresi olabilir. AddressType sütun değerleri Gönderim ve Faturalandırma şeklindedir.

Bu, ShipTo şemasının Adresler ilişkisindeki StreetAddress sütununa eşlediği eşleme şemasıdır. Bu öznitelik için döndürülen değerler, sql:limit-field ve sql:limit-value açıklamaları belirtilerek yalnızca gönderim adresleriyle sınırlandırılır. Benzer şekilde, BillTo şema özniteliği sadece müşterinin faturalama adresini döndürür.

Şema şöyle:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
<xsd:annotation>  
  <xsd:appinfo>  
    <sql:relationship name="CustAddr"  
        parent="Customer"  
        parent-key="CustomerID"  
        child="Addresses"  
        child-key="CustomerID" />  
  </xsd:appinfo>  
</xsd:annotation>  
  
  <xsd:element name="Customer" sql:relation="Customer" >  
   <xsd:complexType>  
        <xsd:sequence>  
        <xsd:element name="BillTo"   
                       type="xsd:string"   
                       sql:relation="Addresses"   
                       sql:field="StreetAddress"  
                       sql:limit-field="AddressType"  
                       sql:limit-value="billing"  
                       sql:relationship="CustAddr" >  
        </xsd:element>  
        <xsd:element name="ShipTo"   
                       type="xsd:string"   
                       sql:relation="Addresses"   
                       sql:field="StreetAddress"  
                       sql:limit-field="AddressType"  
                       sql:limit-value="shipping"  
                       sql:relationship="CustAddr" >  
        </xsd:element>  
        </xsd:sequence>  
        <xsd:attribute name="CustomerID"   type="xsd:int" />   
        <xsd:attribute name="CompanyName"  type="xsd:string" />  
    </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
Örnek XPath sorgusunu şema karşısında test etmek için
  1. tempdb veritabanında iki tablo oluşturun:

    USE tempdb  
    CREATE TABLE Customer (CustomerID int primary key,   
                           CompanyName varchar(30))  
    CREATE TABLE Addresses(CustomerID int,   
                           StreetAddress varchar(50),  
                           AddressType varchar(10))  
    
  2. Örnek verileri ekleyin:

    INSERT INTO Customer values (1, 'Company A')  
    INSERT INTO Customer values (2, 'Company B')  
    
    INSERT INTO Addresses values  
               (1, 'Obere Str. 57 Berlin', 'billing')  
    INSERT INTO Addresses values  
               (1, 'Avda. de la Constituci?n 2222 M?xico D.F.', 'shipping')  
    INSERT INTO Addresses values  
               (2, '120 Hanover Sq., London', 'billing')  
    INSERT INTO Addresses values  
               (2, 'Forsterstr. 57, Mannheim', 'shipping')  
    
  3. Yukarıdaki şema kodunu kopyalayıp metin dosyasına yapıştırın. Dosyayı LimitFieldValue.xmlolarak kaydet.

  4. Aşağıdaki şablonu (LimitFieldValueT.xml) oluşturun ve önceki adımda şemayı (LimitFieldValue.xml) kaydettiğiniz şekilde kaydedin:

    <ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">  
        <sql:xpath-query mapping-schema="LimitFieldValue.xml">  
            /Customer  
        </sql:xpath-query>  
    </ROOT>  
    

    Eşleme şeması (LimitFieldValue.xml) için belirtilen dizin yolu, şablonun kaydedildiği dizine görecelidir. Mutlak bir yol da belirtilebilir, örneğin:

    mapping-schema="C:\MyDir\LimitFieldValue.xml"  
    
  5. Şablonu çalıştırmak için SQLXML 4.0 Test Script'i (Sqlxml4test.vbs) oluşturun ve kullanın.

    Daha fazla bilgi için bkz. Using ADO to execute SQLXML Queries.

Sonuç şu şekildedir:

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">   
  <Customer CustomerID="1" CompanyName="Company A">   
     <BillTo>Obere Str. 57 Berlin</BillTo>   
     <ShipTo>Avda. de la Constituci?n 2222 M?xico D.F.</ShipTo>   
  </Customer>   
  <Customer CustomerID="2" CompanyName="Company B">   
     <BillTo>120 Hanover Sq., London</BillTo>   
     <ShipTo>Forsterstr. 57, Mannheim</ShipTo>   
   </Customer>   
</ROOT>  

B. Gerçek veri tipinin indirim değerine dayalı sonuçları sınırlamak

Bu örnekte, bir veritabanı iki tablo içerir:

  • Emirler (Sipariş Kimliği)

  • SiparişDetaylar (Sipariş Kimliği, Ürün Kimliği, Birim Fiyatı, Miktar, Fiyat, İndirim)

Bu, sipariş detaylarındaki OrderID özniteliğinin, emirler ilişkisindeki OrderID sütununa eşlediği eşleme şemasıdır. Bu öznitelik için döndürülen değerler, yalnızca sql:limit-field ve sql:limit-değer açıklamaları kullanılarak belirtilen Discount özniteliği için belirtildiği şekilde 2.0000000e-001 (0.2) değerine sahip olanlarla sınırlıdır.

Şema şöyle:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
            xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
  <xsd:annotation>  
   <xsd:appinfo>  
    <sql:relationship name="OrderOrderDetails"  
        parent="Orders"  
        parent-key="OrderID"  
        child="OrderDetails"  
        child-key="OrderID" />  
   </xsd:appinfo>  
  </xsd:annotation>  
  <xsd:element name="root" sql:is-constant="1">  
   <xsd:complexType>  
     <xsd:sequence>  
       <xsd:element name="Order" sql:relation="Orders" >  
          <xsd:complexType>  
             <xsd:sequence>  
                <xsd:element name="orderDetail"   
                       sql:relation="OrderDetails"   
                       sql:limit-field="Discount"                       sql:limit-value="2.0000000e-001"  
                       sql:relationship="OrderOrderDetails">  
                   <xsd:complexType>  
                     <xsd:attribute name="OrderID"   />   
                     <xsd:attribute name="ProductID" />   
                     <xsd:attribute name="Discount"  />   
                     <xsd:attribute name="Quantity"  />   
                     <xsd:attribute name="UnitPrice" />   
                   </xsd:complexType>  
                </xsd:element>  
            </xsd:sequence>  
           <xsd:attribute name="OrderID"/>   
          </xsd:complexType>  
       </xsd:element>  
     </xsd:sequence>  
   </xsd:complexType>  
  </xsd:element>  
</xsd:schema>  
Örnek XPath sorgusunu şema karşısında test etmek için
  1. tempdb veritabanında iki tablo oluşturun:

    USE tempdb  
    CREATE TABLE Orders ([OrderID] int NOT NULL ) ON [PRIMARY]  
    ALTER TABLE Orders WITH NOCHECK ADD   
    CONSTRAINT [PK_Orders] PRIMARY KEY  CLUSTERED (  
       [OrderID]  
     )  ON [PRIMARY]   
    CREATE TABLE [OrderDetails] (  
       [OrderID] int NOT NULL ,  
       [ProductID] int NOT NULL ,  
       [UnitPrice] money NULL ,  
       [Quantity] smallint NOT NULL ,  
       [Discount] real NOT NULL   
    ) ON [PRIMARY]  
    
  2. Örnek verileri ekleyin:

    INSERT INTO Orders ([OrderID]) values (10248)  
    INSERT INTO Orders ([OrderID]) values (10250)  
    INSERT INTO Orders ([OrderID]) values (10251)  
    INSERT INTO Orders ([OrderID]) values (10257)  
    INSERT INTO Orders ([OrderID]) values (10258)  
    INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10248,11,14,12,0)  
    INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10250,51,42.4,35,0.15)  
    INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10251,22,16.8,6,0.05)  
    INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10257,77,10.4,15,0)  
    INSERT INTO [OrderDetails] ([OrderID],[ProductID],[UnitPrice],[Quantity],[Discount]) values (10258,2,15.2,50,0.2)  
    
  3. Şemayı (LimitFieldValue.xml) bir dizine kaydedin.

  4. Aşağıdaki test betisini (TestQuery.vbs) oluşturun, MyServer'ı SQL Server bilgisayarınızın adına göre değiştirin ve şemayı kaydetmek için önceki adımda kullandığınız aynı dizine kaydedin:

    Set conn = CreateObject("ADODB.Connection")  
    conn.Open "Provider=SQLOLEDB;Data Source=MyServer;Database=tempdb;Integrated Security=SSPI"  
    conn.Properties("SQLXML Version") = "sqlxml.4.0"   
    Set cmd = CreateObject("ADODB.Command")  
    Set stm = CreateObject("ADODB.Stream")  
    Set cmd.ActiveConnection = conn  
    stm.open  
    result ="none"  
    strXPathQuery="/root"  
    DBGUID_XPATH = "{EC2A4293-E898-11D2-B1B7-00C04F680C56}"  
    cmd.Dialect = DBGUID_XPATH  
    cmd.CommandText = strXPathQuery  
    cmd.Properties("Mapping schema") = "LimitFieldReal.xml"  
    cmd.Properties("Output Stream").Value = stm  
    cmd.Properties("Output Encoding") = "utf-8"  
    WScript.Echo "executing for xml query"  
    On Error Resume Next  
    cmd.Execute , ,1024  
    if err then  
    Wscript.Echo err.description  
    Wscript.Echo err.Number  
    Wscript.Echo err.source  
    On Error GoTo 0  
    else  
    stm.Position = 0  
    result  = stm.ReadText  
    end if  
    WScript.Echo result  
    Wscript.Echo "done"  
    
  5. Windows Explorer'da üzerine tıklayarak TestQuery.vbs dosyasını çalıştırın.

    Sonuç şu şekildedir:

    <root>  
      <Order OrderID="10248"/>  
      <Order OrderID="10250"/>  
      <Order OrderID="10251"/>  
      <Order OrderID="10257"/>  
      <Order OrderID="10258">  
        <orderDetail OrderID="10258"   
                     ProductID="2"   
                     Discount="0.2"   
                     Quantity="50"/>  
      </Order>  
    </root>  
    

Ayrıca Bkz.

Float ve gerçek (Transact-SQL)
nchar ve nvarchar (Transact-SQL)
SQL Server Yerel İstemcisini Yükleme
Sorgularda Açıklamalı XSD Şemalarının Kullanımı (SQLXML 4.0)