我一直在尝试通过这个查询,但我似乎无法找到特定于我的问题的答案。围绕我的问题有很多信息,但我找不到似乎回答它的帖子。我确信这很简单,但我无法做到。这就是我所拥有的:
我有一个将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
我只是不知道自己做错了什么。我是在正确的轨道上吗?是铸造查询这个的最佳方式。我尝试了子字符串,但这也不起作用。我非常感谢大家的帮助。如果您需要更多信息或有更多问题,请与我们联系。
答案 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