[英]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 的INSERT
或UPDATE
。
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.