提取XML文档

时间:2019-01-22 11:33:06

标签: sql xml sql-server-2008-r2

我试图从表的XML列中提取数据,并意识到格式将包含&lt和其他字符,因此我将永远找不到很好的东西。此后,我已将文档转换为nvarchar变量,以便可以通过搜索为文本来执行自己的查找。

我把这个拼凑了一下(很抱歉,很抱歉),我现在想我也许最好还是使用tmp表。

由于使用了TOP 1,我意识到我没有捕获@profilename的每条记录,但是我也希望它能以每条记录的形式出现在主选择主体中,但是我有点迷失了...

DECLARE @LOGGING AS nvarchar(10)
DECLARE @Profilename nvarchar(100)
DECLARE @configxml_vchar nvarchar(MAX)
DECLARE @configxml XML
SET @Profilename = NULL
SET @LOGGING = 'low'
SET @configxml = (Select TOP 1 configxml from dirsyncpro.dbo.bt_config ) ----where bt_config_pk = 5
SET @configxml_vchar = (select cast(@configxml as nvarchar(max)))
SET @profilename = (SELECT SUBSTRING(@configxml_vchar, CHARINDEX('SyncName', @configxml_vchar)
, CHARINDEX('/SyncName',@configxml_vchar) - CHARINDEX('SyncName', @configxml_vchar) + Len('/SyncName')))
select @Profilename AS ProfileName, BT_Config_PK AS ProfileID, LastModified, ConfigXML, @LOGGING AS LogLevel from DirSyncPro.dbo.BT_Config where configxml.exist('//*/text()[contains(upper-case(.),upper-case("LoggingLevel>low</LoggingLevel"))]') = 1

我正在寻找我想像的一个选择,但是无法放置该选择的位置或如何设置它的格式...

感谢您能提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

此问题已在下面修复。...有一个架构,我只是无法使用它。

;WITH XMLNAMESPACES
('http://schemas.datacontract.org/2004/07/BinaryTree.DirSync.Common' AS ns) SELECT BT_Config_PK AS ConfigID, CONVERT(XML, C.ConfigXML.value('(/)[1]', 'nvarchar(max)')).value('(/ns:DirSyncProfile/ns:SyncName)[1]', 'nvarchar(max)') AS ProfileName, CONVERT(XML, C.ConfigXML.value('(/)[1]', 'nvarchar(max)')).value('(/ns:DirSyncProfile/ns:Common/ns:LoggingLevel)[1]', 'nvarchar(max)') AS LoggingLevel FROM BT_Config AS C