久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

在插入 XML 字段之前過濾重復節點

Filter duplicate nodes before inserting into XML field(在插入 XML 字段之前過濾重復節點)
本文介紹了在插入 XML 字段之前過濾重復節點的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我正在使用 xml 字段以這種格式存儲書籍建議:

I am using an xml field to store suggestions for books in this format:

<Books>
  <Book id="1" score="2" />
  <Book id="2" score="3" />
</Books>

在某些時候,我需要在這個 xml 中添加建議.這是通過以下語句完成的:

At some point I need to add suggestions into this xml. This is done with these statements:

DECLARE @books XML;
SELECT @books = Suggestions.query('//books/book') 
FROM User
WHERE UserId = @UserId

UPDATE User
SET Suggestions.modify('insert sql:variable("@books") as first into (//books)[1]')
WHERE UserId = @UserId

如何確保我沒有插入已經存在的節點(僅基于 id 屬性).

How can I make sure I'm not inserting nodes that already exist (based on the id attribute only).

推薦答案

實現它的一種方法是創建僅包含新值的新 XML 變量.

One way to achieve it could be creating new XML variable with only new values.

數據:

CREATE TABLE #User(UserId INT, Suggestions XML, Name VARCHAR(100));

INSERT INTO #User(UserId, Suggestions, Name)
VALUES (1, 
       '<Books>
          <Book id="1" score="2" />
          <Book id="2" score="3" />
        </Books>'
        ,'John');

DECLARE @books XML =N'<Book id="1" score="2" />
                      <Book id="2" score="3" />
                      <Book id="3" score="4" />
                      <Book id="4" score="4" />';

查詢:

DECLARE @UserId INT = 1;
       ,@only_new_books XML;

;WITH books AS
(
   SELECT id    = s.c.value('@id', 'INT'),
          score = s.c.value('@score', 'INT')
   FROM @books.nodes('/Book') AS s(c)
), suggestions AS
( 
  SELECT UserId, 
      id    = s.c.value('@id', 'INT'),
      score = s.c.value('@score', 'INT')
  FROM #User
  CROSS APPLY Suggestions.nodes('//Books/Book') AS s(c)
  WHERE UserId = @UserId
)
SELECT @only_new_books = (SELECT b.id AS '@id',
                                 b.score AS '@score'
                          FROM books b
                          LEFT JOIN suggestions s
                            ON b.id = s.id
                          WHERE s.id IS NULL
                          FOR XML PATH('Book'),TYPE
                          );

UPDATE #User
SET Suggestions.modify('insert sql:variable("@only_new_books") 
                        as first into (//Books)[1]')
WHERE UserId = @UserId;

SELECT * FROM #User;

LiveDemo

輸出:

╔════════╦══════════════════════════════════════╦══════╗
║ UserId ║             Suggestions              ║ Name ║
╠════════╬══════════════════════════════════════╬══════╣
║      1 ║ <Books>                              ║ John ║    
║        ║    <Book id="3" score="4" />         ║      ║
║        ║    <Book id="4" score="4" />         ║      ║
║        ║    <Book id="1" score="2" />         ║      ║
║        ║    <Book id="2" score="3" />         ║      ║
║        ║ </Books>                             ║      ║
╚════════╩══════════════════════════════════════╩══════╝

這篇關于在插入 XML 字段之前過濾重復節點的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

SQL - Select all when filter value is empty(SQL - 過濾器值為空時全選)
How and where do I set the MAXRECURSION option?(如何以及在何處設置 MAXRECURSION 選項?)
TABLOCKX versus SERIALIZABLE(TABLOCKX 與可序列化)
TSQL Constants... Use Variable or Literal?(TSQL 常量...使用變量還是文字?)
TSQL RIGHT String function not working(TSQL RIGHT 字符串函數不起作用)
What is the comparative speed of temporary tables to physical tables in SQL?(SQL中臨時表與物理表的比較速度是多少?)
主站蜘蛛池模板: 久久久久久看片 | 毛片a级毛片免费播放100 | 国产99热 | 欧美午夜精品久久久久久浪潮 | 欧美综合一区二区三区 | 精品一区二区视频 | 草草精品 | 天天爽综合网 | 日本超碰 | 亚洲色片网站 | 国产精品久久久久久久久免费 | 久久精品91久久久久久再现 | 亚洲视频二 | 午夜免费精品视频 | 日韩视频一区二区 | 精品久久不卡 | 毛片免费在线 | 久久国产精品久久国产精品 | 久久青视频 | 2023亚洲天堂 | 久久久女 | www.久久精品 | 亚欧精品一区 | 国产一级在线 | 在线播放国产视频 | 福利视频二区 | 国产精品久久久久久久免费大片 | 国产精品99久久久久久人 | 亚洲第一色av | 国产不卡一区 | 97精品超碰一区二区三区 | 久久y| 91成人在线 | 中文字幕在线剧情 | 精品欧美色视频网站在线观看 | 亚洲精品免费在线 | 啪啪av | 有码一区 | 91视频在线| 美日韩免费视频 | 91在线网|