简体   繁体   English

SQL 服务器 XML 查询

[英]SQL Server XML queries

I'm trying to find a solution for this task: write a procedure that accepts XML document in the following format:我正在尝试为此任务找到解决方案:编写一个接受 XML 文档的程序,格式如下:

<Buyer N="John" S="Doe" CTY="Madrid" CTR="Spain">
   <E>John.Doe@gmail.com</E> 
   <T>123456789</T> 
</Buyer> 

The procedure must verify if your database already contains the country, city or buyer (check buyer by email).该程序必须验证您的数据库是否已经包含国家、城市或买家(通过电子邮件检查买家)。

If any data is missing in your database, your procedure has to insert it into the table.如果您的数据库中缺少任何数据,您的过程必须将其插入到表中。

Call the functions that show the mentioned procedure functionalities.调用显示上述过程功能的函数。

This is how I started to separate all the important things:这就是我开始分离所有重要事物的方式:

CREATE PROCEDURE pXML
    @var XML
AS
    SELECT
        X.U.value('@N', 'nvarchar(20)') AS pName,
        X.U.value('@S', 'nvarchar(20)') AS pSurename,
        X.U.value('@CTY', 'nvarchar(20)') AS pCity,
        X.U.value('@CTR', 'nvarchar(20)') AS pCountry
    FROM
        @var.nodes('/Buyer') AS X(U)

    SELECT X.U.value('.', 'nvarchar(50)' ) AS pEmail
    FROM @var.nodes('/Buyer/E') as X(U)

What I don't know is how to put IF statement, or whatever condition is necessary INSIDE that procedure.我不知道如何在该过程中放置 IF 语句或任何必要的条件。

My pseudo code would be:我的伪代码是:

declare @temp nvarchar(30)
set @temp = pEmail

IF NOT EXISTS(select * from Buyers where Buyer.Email = pEmail)
   INSERT INTO Buyer values (pName, pSurename, pCity, pCountry)
(more IF NOT EXISTS statements for city and for country)

Is anyone willing to give me a hand here?有人愿意在这里帮我一把吗?

Thanks in advance, Tell me if didn't clarify enough.在此先感谢,如果不够清楚,请告诉我。 I'll do my best to add any needed info.我会尽力添加任何需要的信息。

Please try the following solution.请尝试以下解决方案。

It is using MERGE statement to handle INSERT or UPDATE based on the email.它使用MERGE语句来处理基于 email 的INSERTUPDATE

SQL SQL

-- DDL and sample data population, start
DECLARE @Buyer TABLE (
    ID INT IDENTITY PRIMARY KEY, 
    pEmail NVARCHAR(100), 
    pName nvarchar(20), 
    pSurename nvarchar(20), 
    pCity nvarchar(20), 
    pCountry nvarchar(20)
);
INSERT INTO @Buyer (pEmail, pName, pSurename, pCity, pCountry) VALUES
(N'John.Doe@gmail.com', N'John', N'Doe', N'Madrid', N'Spain');
-- DDL and sample data population, end

-- before
SELECT * FROM @Buyer;


DECLARE @var XML =
N'<Buyer N="Johnny" S="Doe" CTY="Barcelona" CTR="Spain">
    <E>John.Doe@gmail.com</E> 
    <T>123456789</T> 
</Buyer>';

MERGE INTO @Buyer as Trg  
USING (
   SELECT c.value('(E/text())[1]', 'nvarchar(100)') as pEmail
        , c.value('@N', 'nvarchar(20)') as pName
        , c.value('@S', 'nvarchar(20)') as pSurename
        , c.value('@CTY', 'nvarchar(20)') as pCity
        , c.value('@CTR', 'nvarchar(20)') as pCountry
    FROM @var.nodes('/Buyer') AS t(c)
) as Src  
ON Trg.pEmail = Src.pEmail  
WHEN Matched /*AND Src.pName IS NOT NULL*/ THEN -- if needed to add additional conditions
UPDATE 
SET Trg.pName = Src.pName  
    , Trg.pSurename = Src.pSurename  
    , Trg.pCity = Src.pCity  
    , Trg.pCountry = Src.pCountry    
WHEN NOT MATCHED THEN  
INSERT (pEmail, pName, pSurename, pCity, pCountry) VALUES 
    (Src.pEmail, Src.pName, Src.pSurename, Src.pCity, Src.pCountry)
OUTPUT
    $action ,
    inserted.*;

-- after
SELECT * FROM @Buyer;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM