存储为nvarchar(max)的xml上的SQL查询

时间:2018-06-18 14:26:55

标签: sql sql-server xml nvarchar

SQL Query on xml stored as nvarchar(max)

我一直在尝试通过这个查询,但我似乎无法找到特定于我的问题的答案。围绕我的问题有很多信息,但我找不到似乎回答它的帖子。我确信这很简单,但我无法做到。这就是我所拥有的:

我有一个将XML数据存储为nvarchar(max)的列,我试图查询标记而没有太多运气。查看图片,<VU>是根,我正在尝试获取<CPort>(80)的值,但我无法获得正确的语法。我附上了截图,以便更清晰。

到目前为止我所拥有的是:

SELECT CAST(directory.dbo.unit.data AS XML) AS info
FROM Directory.dbo.unit

这让我可以将我的列转换为XML,但是我无法查询新建的列。

我试过了:

SELECT CAST(directory.dbo.unit.data AS XML).query('(/VU/)') AS info
FROM Directory.dbo.unit

但结果为NULL。我也尝试过:

SELECT CAST(directory.dbo.unit.data AS XML).value('(/VU/CPort)[1]', 'nvarchar(max)') AS info
FROM Directory.dbo.unit

这也会产生NULL

我只是不知道自己做错了什么。我是在正确的轨道上吗?是铸造查询这个的最佳方式。我尝试了子字符串,但这也不起作用。我非常感谢大家的帮助。如果您需要更多信息或有更多问题,请与我们联系。

2 个答案:

答案 0 :(得分:0)

尝试这样的事情......

declare @data table (text nvarchar(max) null);
insert @data values
('<VU><CPort>80</CPort></VU>'),
('<VU><CPort>81</CPort></VU>'),
('<VU><CPort>82</CPort></VU>'),
('<VU><CPort>83</CPort></VU>'),
('<VU><CPort>84</CPort></VU>'),
('<VU><CPort>85</CPort></VU>'),
('<VU><CPort>86</CPort></VU>'),
('<VU><CPort>87</CPort></VU>'),
('<VU><CPort>88</CPort></VU>'),
('<VU><CPort>89</CPort></VU>')
;

-- *** This is the important part ***
select cast(text as xml).value('(/VU/CPort)[1]', 'int') from @data;

答案 1 :(得分:0)

我想感谢大家的帮助和指导。我终于能够得到想要的东西。我不得不转换几个包含以nvarchar(max)存储的xml数据的列,然后绑定一些其他列,但是我认为这是可行的。 这是我下面的最终解决方案。

    With test as (Select Guid as guid, FirmwareVersion as FV, CAST(Directory.dbo.Unit.data as xml) as new, CAST(Directory.dbo.Unit.Location as xml) as loc from Directory.dbo.Unit)

        select UnitName1, Manufacturer, model, FV, IP, TimeZone, PhysicalName, [user], CameraName, LogicalID
        from (
            select distinct
            test.guid
            ,ue.name UnitName1
            ,test.new.value('(./VU/Mfct)[1]','varchar(100)') as Manufacturer
            ,test.new.value('(./VU/Model)[1]','varchar(100)') as Model
            ,test.new.value('(./VU/CAddr)[1]','varchar(100)') as IP
            ,test.loc.value('(./EntityLocation/TimeZoneId)[1]','varchar(100)') as TimeZone
            ,d.physicalname
            ,test.FV
            ,test.new.value('(./VU/User)[1]','varchar(100)') as [User]
            ,CE.NAME CameraName
            ,CE.LogicalID
            from test 
            inner join Directory.dbo.Device d on test.guid = d.unit
            INNER JOIN Directory.dbo.Entity UE ON test.Guid = uE.Guid
            INNER JOIN Directory.dbo.Stream S ON S.Device = D.GUID 
            INNER JOIN Directory.dbo.Camera C ON S.Camera = C.GUID 
            INNER JOIN Directory.dbo.Entity CE ON C.Guid = CE.Guid
            where charindex('Camera',d.PhysicalName,0) > 0
        ) x
        order by IP desc, guid, UnitName1, cameraname, LogicalID

这可能不是写这篇文章的最漂亮或最有效的方法,但是它对我有用!再次感谢大家! techstudent01