繁体   English   中英

SQL 服务器 XML 查询

[英]SQL Server XML queries

我正在尝试为此任务找到解决方案:编写一个接受 XML 文档的程序,格式如下:

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

该程序必须验证您的数据库是否已经包含国家、城市或买家(通过电子邮件检查买家)。

如果您的数据库中缺少任何数据,您的过程必须将其插入到表中。

调用显示上述过程功能的函数。

这就是我开始分离所有重要事物的方式:

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)

我不知道如何在该过程中放置 IF 语句或任何必要的条件。

我的伪代码是:

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)

有人愿意在这里帮我一把吗?

在此先感谢,如果不够清楚,请告诉我。 我会尽力添加任何需要的信息。

请尝试以下解决方案。

它使用MERGE语句来处理基于 email 的INSERTUPDATE

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