[英]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
我只是不知道我在做什么錯。 我在正確的軌道上嗎? 正在投放查詢此內容的最佳方法。 我嘗試了子字符串,但這也不起作用。 我非常感謝大家的幫助。 讓我知道您是否需要更多信息或有更多疑問。
試試這樣的東西...
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;
我要說謝謝大家的幫助和指導。 我終於能夠得到想要的東西。 我不得不轉換幾個包含以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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.