【问题标题】:How to pass parameters from WebService to stored procedure with XML如何使用 XML 将参数从 WebService 传递到存储过程
【发布时间】:2016-09-16 07:05:08
【问题描述】:

我想将参数传递给我的存储过程。我是这个话题的新手。我有 URL 请求,发送类型 xml 的内容并使用 post 方法返回我的 xml 响应。现在我将使用 xlmserializer 获取这些数据并传递给存储过程。你有一些信息,材料如何做到这一点? 这是我的 XML 响应:

<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://xmlsoap" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://xmlsoap" xmlns:soap="http://xmlsoap">
    <soap:Body>
        <listCarsResponse xmlns="http://www.webservice">
            <cars>
                <car name="Toyota" car_id="1" />
            </cars>
        </listCarsResponse>
    </soap:Body>
</soap:Envelope>

【问题讨论】:

  • 您的 XML 看起来如何?传递 XML 参数 as-is 并在 SQL Server 存储过程中进行粉碎可能更简单...
  • 输入的 XML 将始终具有相同的结构?你想用这些数据做什么?
  • @gofr...否,输入 XML 结构接收各种参数。我必须将所有 XML 响应中的参数传递给相关程序。

标签: .net sql-server xml web-services


【解决方案1】:

使用 SQL 进行粉碎将如下所示:

DECLARE @xml XML=
'<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://xmlsoap" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://xmlsoap" xmlns:soap="http://xmlsoap">
    <soap:Body>
        <listCarsResponse xmlns="http://www.webservice">
            <cars>
                <car name="Toyota" car_id="1" />
            </cars>
        </listCarsResponse>
    </soap:Body>
</soap:Envelope>';

WITH XMLNAMESPACES('http://xmlsoap' AS [soap]
                  ,'http://www.webservice' AS innerDefault)
SELECT c.value('(innerDefault:car/@name)[1]','nvarchar(max)') AS CarName
      ,c.value('(innerDefault:car/@car_id)[1]','int') AS Car_Id
FROM @xml.nodes('/soap:Envelope/soap:Body/innerDefault:listCarsResponse') AS A(lcr)
CROSS APPLY lcr.nodes('innerDefault:cars') AS B(c);

结果

CarName Car_Id
Toyota  1

UPDATE 同一个存储过程

--我将参数作为VARACHAR(MAX) 传递,否则您可能会遇到utf-8 的问题...

CREATE PROCEDURE dbo.YourProc(@XMLasString VARCHAR(MAX))
AS
BEGIN
    --cast it to XML
    DECLARE @xml XML=CAST(@XMLasString AS XML);

    WITH XMLNAMESPACES('http://xmlsoap' AS [soap]
                      ,'http://www.webservice' AS innerDefault)
    SELECT c.value('(innerDefault:car/@name)[1]','nvarchar(max)') AS CarName
          ,c.value('(innerDefault:car/@car_id)[1]','int') AS Car_Id
    FROM @xml.nodes('/soap:Envelope/soap:Body/innerDefault:listCarsResponse') AS A(lcr)
    CROSS APPLY lcr.nodes('innerDefault:cars') AS B(c);

END
GO

--这里我将它创建为NVARCHAR(MAX),只是为了表明这是作为非unicode传入的,因此不会因为utf-8而中断

DECLARE @parameter NVARCHAR(MAX)= N' ';

EXEC dbo.YourProc @XmlAsString=@parameter

--清理

GO
DROP PROCEDURE dbo.YourProc;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2019-10-13
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多