2016-04-07 15 views
2

Xml biçiminde istek içeren bir tablom var. eg için :Mağaza yordamında xml ayrıştırma nasıl yapılır

Api_id xmlRequest Sent_Time 
1  ........ 07-04-2016 10:07:12:345 
1  ........ 08-04-2016 10:03:12:345 
2  ........ 09-04-2016 10:08:12:345 
2  ........ 09-04-2016 10:09:12:345 

Api_id için, birden fazla isteği olabilir.

XML istek şeması aynıdır ancak farklı değerleri vardır. Ben mağaza prosedürünü gerek

<?xml version="1.0"?> 
<!DOCTYPE PARTS SYSTEM "parts.dtd"> 
<PARTS> 
    <TITLE>Computer Parts</TITLE> 
    <PART> 
     <ITEM>Motherboard</ITEM> 
     <MANUFACTURER>ASUS</MANUFACTURER> 
     <MODEL>P3B-F</MODEL> 
     <COST> 123.00</COST> 
    </PART> 
</PARTS> 

, bu yüzden, (i xml isteğinde arama yapabilirsiniz) API_id ve değeri göndermek ve Öğe değerine dayalı xml isteklerini alabilirsiniz: olarak Xml talebidir.

CREATE PROCEDURE getxmlRequest(
     @Api_Id INT 
     @value 
     ,@xmlRequest VARCHAR(max) out) 
AS 
BEGIN 
     Set @xmlRequest = SELECT xmlRequest FROM Api_request 
      WHERE Api_id = @Api_id 
     /* here need to iterate over @xmlRequest */ 
       Set @Xmlvalue = SELECT X.R.value ('.','nvarchar (150)') 
        FROM @xmlRequest.nodes(XPATH) X(R) 
       if(@XmlValue = @value) 
       /*Add to result so i can return 
     /*I want to return all @xmlRequest if we has value from xpath*/    
END; 

Benim soru

Set @xmlRequest = SELECT xmlRequest FROM Api_request 
       WHERE Api_id = @Api_id 

biz birden sonuç elde olacaksa edin: yineleme mümkün geliyor? Eğer evet ise ne kadar verimli olabilirim?

Api_id'de birden çok @ xmlRequest nasıl döndürülür?

Bu tür bir senaryo üzerinde çalışan herhangi biri var mı? Lütfen bana yardım et.

+0

Tablonuzdaki XML zaten XML yazılıyor mu yoksa bu VARCHAR mı ( ') nedeniyle soruluyor mu? – Shnugo

+0

@Shnugo: xmlRequest alanı VARCHAR türüdür. – Somu

+0

Neden * read * data'dan başka bir şey yapmazsanız saklı bir prosedürü kullanmak istersiniz? Bir TVF veya VIEW kullanın ... Ve dahası: Örneğiniz aradığınız şeyi silmeye değil. Sözde kod bile derleme değildi. Geçirdiğiniz parametreler neler? – Shnugo

cevap

-1

Sorunuz oldukça belirsizdir, fakat bu ifadeyi lütfen:

CREATE TABLE #testTbl(Api_id INT, xmlRequest VARCHAR(MAX), SentTime DATETIME); 
INSERT INTO #testTbl VALUES 
(1,'<?xml version="1.0"?> 
<!DOCTYPE PARTS SYSTEM "parts.dtd"> 
<PARTS> 
    <TITLE>Computer Parts</TITLE> 
    <PART> 
     <ITEM>Motherboard</ITEM> 
     <MANUFACTURER>ASUS</MANUFACTURER> 
     <MODEL>P3B-F</MODEL> 
     <COST> 123.00</COST> 
    </PART> 
</PARTS>',GETDATE()) 
,(1,'<?xml version="1.0"?> 
<!DOCTYPE PARTS SYSTEM "parts.dtd"> 
<PARTS> 
    <TITLE>Computer Parts</TITLE> 
    <PART> 
     <ITEM>CPU</ITEM> 
     <MANUFACTURER>INTEL</MANUFACTURER> 
     <MODEL>CPUModelXY</MODEL> 
     <COST>345.00</COST> 
    </PART> 
</PARTS>',GETDATE()) 
,(2,'<?xml version="1.0"?> 
<!DOCTYPE PARTS SYSTEM "parts.dtd"> 
<PARTS> 
    <TITLE>Car Parts</TITLE> 
    <PART> 
     <ITEM>Wheel</ITEM> 
     <MANUFACTURER>Pirelli</MANUFACTURER> 
     <MODEL>WheelModelXY</MODEL> 
     <COST>100.00</COST> 
    </PART> 
</PARTS>',GETDATE()); 

Bu Api_id = 1

SELECT Api_id 
     ,CONVERT(XML,xmlRequest,2) AS xmlRequest 
     ,SentTime 
FROM #testTbl 
WHERE Api_id=1; 

Bu tablo benzeri verileri döndürür tüm satırları rerturn edecektir. Bu sorgu deneyin (GRUP TARAFINDAN, ...,)

DECLARE @Api_Id INT=NULL; 

WITH MyRequests AS 
(
    SELECT Api_id 
      ,RealXML.value('(/PARTS/TITLE)[1]','varchar(max)') AS Title 
      ,part.value('ITEM[1]','varchar(max)') AS Item 
      ,part.value('MANUFACTURER[1]','varchar(max)') AS Manufacturer 
      ,part.value('MODEL[1]','varchar(max)') AS Model 
      ,part.value('COST[1]','decimal(12,4)') AS Cost 
      ,SentTime 
    FROM #testTbl 
    CROSS APPLY(SELECT CONVERT(XML,xmlRequest,2) AS RealXML) AS ConvertedToXML 
    CROSS APPLY RealXML.nodes('/PARTS/PART') AS A(part) 
    WHERE @ApiId IS NULL OR [email protected]_Id 
) 
SELECT * 
FROM MyRequests 
--WHERE ... 
--GROUP BY ... 
--ORDER ... 
; 

sonucu

+---+----------------+-------------+---------+--------------+----------+-------------------------+ 
| 1 | Computer Parts | Motherboard | ASUS | P3B-F  | 123.0000 | 2016-04-07 11:54:08.980 | 
+---+----------------+-------------+---------+--------------+----------+-------------------------+ 
| 1 | Computer Parts | CPU   | INTEL | CPUModelXY | 345.0000 | 2016-04-07 11:54:08.980 | 
+---+----------------+-------------+---------+--------------+----------+-------------------------+ 
| 2 | Car Parts  | Wheel  | Pirelli | WheelModelXY | 100.0000 | 2016-04-07 11:54:08.980 | 
+---+----------------+-------------+---------+--------------+----------+-------------------------+ 

temizlemek

GO 
DROP TABLE #testTbl; 
0

devam etmek için "normal" SQL kullanabilirsiniz

SELECT *,CONVERT(XML,xmlRequest,2) 
FROM Api_request 
WHERE Api_id = @Api_id 
    AND CONVERT(XML,xmlRequest,2).value('(/PARTS/PART/ITEM)[1]','nvarchar(max)') 
     LIKE '%'[email protected]+'%' 

Tüm xmlRequest, conta'nın bulunduğu yere dönecektir. ins your

+0

Bir yorumda bahsedilen, xmlRequest sütununun "VARCHAR" türünde olduğunu, ".value()' yi kullanmanıza izin verilmeyeceğini "yorumladı. – Shnugo

+0

Daha sonra bu dizgeyi XML'ye dönüştürebilir (örneğin cast (xmlRequest) olarak xml) .value ('(/ PARTS/BÖLÜM/ÖĞE) [1]', 'nvarchar (max)') '% CPU%') –

+0

Sadece orijinal veri ile deneyin ;-) – Shnugo