2012-10-16 35 views
8

Xin lỗi nếu đây là nơi khác, tôi đã tìm thấy rất nhiều ví dụ tương tự nhưng tôi không thể làm cho nó hoạt động với dữ liệu của mình. 2 ngày sau đó và tôi cần một câu trả lời :(Thuộc tính xml truy vấn SQL Server cho giá trị phần tử

Về cơ bản có một bảng SQL Server với một cột chứa dữ liệu XML. Những thông tin này có chứa các giá trị tôi cần phải giải nén.

Đây là XML của tôi.

<CustomFields xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.kaseya.com/vsa/2007/12/ServiceDeskDefinition.xsd"> 
    <Field fieldName="AutoCategory">Event Log</Field> 
    <Field fieldName="SType">Event Log</Field> 
    <Field fieldName="STag1">AgentGuid</Field> 
    <Field fieldName="STag2">AlertRegistrationId</Field> 
    <Field fieldName="STag3">LogType</Field> 
    <Field fieldName="SValue1">619764177412541</Field> 
    <Field fieldName="SValue2">104</Field> 
    <Field fieldName="SValue3">1380569194</Field> 
    <Field fieldName="SdTicketId">RPSv1006330</Field> 
    <Field fieldName="AgentName">bla bla</Field> 
    <Field fieldName="MachineGroupGuid">86115414719112271316891312</Field> 
    <Field fieldName="OrgFk">59165166782128125214185317</Field> 
    <Field fieldName="GuidAgent">619764177412541</Field> 
    <Field fieldName="AlertCount">0</Field> 
    <Field fieldName="TicketTitle">bla bla</Field> 
    <Field fieldName="LegacyId">152262</Field> 
    <Field fieldName="LegacyRef">152262</Field> 
    <Field fieldName="CwStatus">2</Field> 
    <Field fieldName="CwTicketId">89495</Field> 
</CustomFields> 

tôi cần để có thể kéo ra giá trị liên quan đến tên CwTicketId lĩnh vực.

Vì vậy, trong bản chất, tôi muốn xem xét thông qua XML để tìm các nút với fieldName = "CwTicketId" và trở 89495 hoặc tương đương giá trị. Dưới đây là mã tôi đã tự tìm ra, điều này kéo giá trị ra, nhưng vấn đề đôi khi XML được sắp xếp theo thứ tự khác nhau, vì vậy các giá trị không phải lúc nào cũng trên dòng mà tôi đã chỉ định, do đó nó trả về chính xác dữ liệu.

;WITH XMLNAMESPACES(DEFAULT N'http://www.kaseya.com/vsa/2007/12/ServiceDeskDefinition.xsd') 
SELECT 
    ref as ServiceDeskID, 
    sdSummary as ServiceDeskSummary, 
    customFields.value('(/CustomFields/Field/node())[17]', 'varchar(100)') as LegacyIDTicketing, 
    customFields.value('(/CustomFields/Field/node())[19]', 'varchar(100)') as CWIDTicketing 
FROM 
    [ksubscribers].[kasadmin].[SDIncident] 

Giá trị thứ hai tôi cũng cần, nhưng nếu tôi có thể tìm ra cách để kéo một giá trị ra, tôi có thể nhân đôi cho giá trị kia.

Hy vọng ai đó có thể giúp đỡ khi tôi bắt đầu tách tóc ra!

Cảm ơn sự giúp đỡ !!

Trả lời

7
;WITH XMLNAMESPACES(DEFAULT N'http://www.kaseya.com/vsa/2007/12/ServiceDeskDefinition.xsd') 
select 
    T.C.value('data(.)', 'nvarchar(128)') 
from [YOUR_TABLE] as Y 
    outer apply Y.[YOUR_XML_COLUMN].nodes('/CustomFields/Field[@fieldName="CwTicketId"]') as T(C) 
+0

Xin chào Roman, cảm ơn bạn đã trả lời rất nhanh. Bạn có thể giúp tôi hiểu cách sử dụng cái này không? Hiện tại tôi đã kéo XML trực tiếp từ bản ghi, tôi không hiểu T.C.value và @ XML.nodes. Các ứng dụng nhưng tôi là một câu lệnh SQL hoàn chỉnh. – Divvet

+0

Tôi không nghĩ rằng tôi có thể giải thích tốt hơn msdn :) Về cơ bản bạn cần phải đọc về đọc XML từ SQL. Ngoài ra, bạn cần phải đọc về xpath và xquery - bạn sẽ cần nó để đọc dữ liệu từ XML. Tôi đã thay đổi một truy vấn một chút - giống như bạn có một bảng và cột xml trong bảng này –

+0

Cảm ơn Roman, các thay đổi của bạn đã đủ để cho phép tôi làm cho mọi thứ hoạt động! – Divvet

4

Hãy thử điều này:

;WITH XMLNAMESPACES(DEFAULT N'http://www.kaseya.com/vsa/2007/12/ServiceDeskDefinition.xsd') 
SELECT 
    ref as ServiceDeskID, 
    sdSummary as ServiceDeskSummary, 
    CwTicketID = customFields.value('(/CustomFields/Field[@fieldName="CwTicketId"]/text())[1]', 'int') 
FROM 
    [ksubscribers].[kasadmin].[SDIncident] 

này chọn nút <Field> rằng có CwTicketId như thuộc tính tên lĩnh vực của mình - và điều này sẽ làm việc luôn, bất kể như thế nào XML và các nút của nó được sắp xếp (như miễn là fieldNamegiá trị giữ nguyên CwTicketId).

+1

Cảm ơn Marc, bạn cũng làm việc rất tốt! Vô cùng ấn tượng bởi tốc độ và chất lượng của trang web này! – Divvet

Các vấn đề liên quan