簡體   English   中英

在XML上以nvarchar(max)存儲的SQL查詢

[英]SQL query on xml stored as nvarchar(max)

以nvarchar(max)存儲的xml上的SQL查詢

我一直在嘗試通過該查詢進行工作,但是似乎找不到針對我的問題的答案。 關於我的問題,有很多信息,但是我找不到似乎可以回答該問題的帖子。 我敢肯定這很簡單,但是我做對了。 這是我所擁有的:

我有一列將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM