針對於 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]