Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在存储过程中进行xml解析_Sql Server_Xml_Stored Procedures - Fatal编程技术网

Sql server 如何在存储过程中进行xml解析

Sql server 如何在存储过程中进行xml解析,sql-server,xml,stored-procedures,Sql Server,Xml,Stored Procedures,我有一个包含xml格式请求的表。 例如: 对于Api_id,我们可以有多个请求 XML请求模式相同,但具有不同的值。 Xml请求如下所示: <?xml version="1.0"?> <!DOCTYPE PARTS SYSTEM "parts.dtd"> <PARTS> <TITLE>Computer Parts</TITLE> <PART> <ITEM>Motherboard</I

我有一个包含xml格式请求的表。 例如:

对于Api_id,我们可以有多个请求

XML请求模式相同,但具有不同的值。 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> 
那么我的问题是

Set @xmlRequest = SELECT xmlRequest FROM Api_request
              WHERE Api_id = @Api_id
如果我们将得到多个结果:是否可以迭代?如果是,我的效率如何

当Api_id相同时,如何返回多个@xmlRequest


有人在这种情况下工作吗?请帮帮我。

你的问题很不清楚,但请看一下:

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());
这将返回类似于表的数据。您可以使用“普通”SQL(其中,GROUPBY…)继续

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 Api_Id=@Api_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;

你的问题很不清楚,但请看一下:

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());
这将返回类似于表的数据。您可以使用“普通”SQL(其中,GROUPBY…)继续

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 Api_Id=@Api_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;
请尝试此查询

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 '%'+@value+'%'
它将返回包含您的值的所有xmlRequest,请尝试此查询

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 '%'+@value+'%'

它将返回包含您的值的所有xmlRequest

表中的XML是否已经是XML类型的,还是这是VARCHAR(由于
而询问)?@Shnugo:xmlRequest字段是VARCHAR类型。如果您只读取数据,为什么要使用存储过程?使用TVF或视图。。。此外,你的例子并没有明确说明你在寻找什么。伪代码甚至无法编译。你传递的参数是什么?@Shnugo:谢谢你的帮助。正如我所提到的,我将对存储过程进行解析,因为它包含大量数据,并将使用java调用该过程。在java中,每次调用不同的查询可能会很痛苦。我正在从数据库中搜索xmlRequest字段。我将传递Id和值,使用Id,我将获得xml请求。例如:假设3个xml请求。现在使用值输入,我将检查每个xml请求,并仅在xml包含值时返回xmlRequest。是否在任何地方包含值?甚至部分内容?表中的XML是否已被XML类型化,或者这是VARCHAR(由于
)吗?@Shnugo:xmlRequest字段是VARCHAR类型。如果只读取数据,为什么要使用存储过程?使用TVF或视图。。。此外,你的例子并没有明确说明你在寻找什么。伪代码甚至无法编译。你传递的参数是什么?@Shnugo:谢谢你的帮助。正如我所提到的,我将对存储过程进行解析,因为它包含大量数据,并将使用java调用该过程。在java中,每次调用不同的查询可能会很痛苦。我正在从数据库中搜索xmlRequest字段。我将传递Id和值,使用Id,我将获得xml请求。例如:假设3个xml请求。现在使用值输入,我将检查每个xml请求,并仅在xml包含值时返回xmlRequest。是否在任何地方包含值?甚至部分内容?OP在评论中提到,xmlRequest列的类型为
VARCHAR
,您将不允许在那里使用
.value()
,然后他可以简单地将该字符串转换为XML(即cast(xmlRequest为XML).value('(/parts/PART/ITEM)[1]',nvarchar(max)],就像“%CPU%”一样,只需使用原始数据试试;-)当然,我知道。我的回答中也有同样的要求。我们只是不知道OP想要搜索的数据保存在哪个元素中。一个提示:测试您的建议…评论中提到的OP,xmlRequest列的类型是
VARCHAR
您将不允许在那里使用
.value()
…然后他可以简单地将该字符串转换为XML(即转换为XML的xmlRequest).value('(/PARTS/PART/ITEM)[1]',nvarchar max'),比如“%CPU%”)用原始数据试试;-)当然,我知道。我的回答中也有同样的要求。我们只是不知道OP想要搜索的数据保存在哪个元素中。一个提示:测试你的建议。。。