SQL Server: 刪除 XML 字段的某個節點

針對於 SQL Server 中的 XML 列,如何刪除其中的一個 XML 節點呢?這裏有兩種方法。

方法1 直接通過SQL語句將目標節點設置爲 null即可,直截了當,非常容易。

方法2 如下,查詢後進行修改(相關操作我封裝成了一個存儲過程來演示,如下存儲過程會從不同位置讀取數據,並通過遊標尋找並處理由 Guid 格式標明的目標數據)

[sql]
IF( Object_id('proc_ClearSomeInformation', 'p') IS NOT NULL )
DROP PROC proc_ClearSomeInformation
GO

CREATE PROCEDURE proc_ClearSomeInformation(
@sourceTable nvarchar(max),
@identity nvarchar(max))
AS
DECLARE @metadata xml

IF @sourceTable = 'SourceA'
SET @metadata = (SELECT MetadataSet FROM SourceA WHERE Id = @identity)
ELSE
SET @metadata = (SELECT MetadataSet FROM SourceB WHERE Id = @identity)

DECLARE @mssql nvarchar(max)
DECLARE @result xml
-- Start to reset the metadata XML value
DECLARE @columnName nvarchar(max)
DECLARE traversalMetadataName CURSOR FAST_FORWARD FOR
-- Get all metadata columns and traver them.
SELECT name FROM syscolumns WHERE (id = (SELECT id FROM sysobjects WHERE (name = @sourceTable)))
AND name like 'M[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]_%'
-- GUID Format

OPEN traversalMetadataName
FETCH NEXT FROM traversalMetadataName INTO @columnName
WHILE @@fetch_status = 0
BEGIN
SET @mssql = N'SET @metadata.modify(''delete (/' + @columnName + ')[1]'')'
EXEC sp_executesql @mssql, N'@metadata xml OUT', @metadata OUT
FETCH NEXT FROM traversalMetadataName INTO @columnName
END
CLOSE traversalMetadataName
DEALLOCATE traversalMetadataName

SET @mssql = N'UPDATE ' + @sourceTable + ' SET MetadataSet = @metadata WHERE Id = ''' + @identity + ''''
EXEC sp_executesql @mssql, N'@metadata xml', @metadata

GO
[/sql]

查看原文:http://nap7.com/me/sql-delete-xml-node/

發佈了37 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章