2016-04-07 19 views
2

xmlフォーマット要求を含むテーブルがあります。例えばのために :ストアプロシージャでXML解析を行う方法

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のために、我々は複数の要求を持つことができます。

XMLリクエストスキーマは同じですが、値が異なります。私は店の手続きを必要とする

<?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> 

ので、私は(私はXMLリクエストに検索することができます)API_id、および値を送信し、アイテムの値に基づいて、XML要求を取得することができますよう XML要求があります。

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; 

だから私の質問は

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

我々は複数の結果を取得する場合場合は、次の反復処理することが可能でしょうか?はいの場合、私はどのように効率的ですか?

複数の@xmlRequestをApi_idとして返す方法は同じですか?

このような種類のシナリオでは、どなたでも作業できますか?私を助けてください。

+0

あなたのテーブルのXMLはすでにXML型であるか、このVARCHARです( '<!DOCTYPE ...>'のために尋ねられます)? – Shnugo

+0

@ Shnugo:xmlRequestフィールドはVARCHAR型です。 – Somu

+0

*データを読み取る以外に*何もしないのであれば、なぜストアドプロシージャを使いたいのですか? TVFまたはVIEWを使用してください。さらに、あなたの例は、あなたが探しているものをクリアしません。擬似コードはコンパイルされません。あなたが渡しているパラメータは何ですか? – Shnugo

答えて

-1

あなたの質問は非常に明確ではないが、この上を見てください。

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()); 

これはApi_id = 1

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

これは、テーブルのようなデータが返されますすべての行をrerturnます。あなたは、このクエリを試してみてください(GROUP BY、...は、)

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 ... 
; 

結果

+---+----------------+-------------+---------+--------------+----------+-------------------------+ 
| 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 | 
+---+----------------+-------------+---------+--------------+----------+-------------------------+ 

クリーンアップ

GO 
DROP TABLE #testTbl; 
0

を続けるために "正常な" SQLを使用することができます

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]+'%' 

すべてのxmlRequestを返します。contaあなたの価値を入れてください

+0

xmlRequestの型が 'VARCHAR'型であるというコメントにOPが記述されていると、そこに' .value() 'を使用することはできません... – Shnugo

+0

その後、単にその文字列をXMLに変換できます'%CPU%') –

+0

元のデータで試してみてください;-) – Shnugo