2011-04-13 76 views
1

我目前正在使用存儲過程生成報告。查詢存儲過程中的XML字符串

表結構::

//File Table Fields 
FILE_ID (int) 
FILE_DATE (string) 
FILE_CONTENTS (XML) 
FILE_CONTENTS_STRING (string) 
PROCESSED (bool) 

存儲過程:

//Grabs the ID and Date for each of the Unprocessed Files 
SELECT [FILE_ID], 
     [FILE_DATE] 
    FROM [tbFILES] 
WHERE [PROCESSED] = 0 
存儲過程從文件的表,類似於以下 (simplfied爲了簡潔)收集關於未處理文件的信息

我想輸出兩個額外的字段,在FILE_CONTENTS(或FILE_CONTENTS_STRING),這是在XML /字符串都發現在地區這樣的:

XML結構部分:

<FID.4> 
     <FID.4.1>TESTING</FID.4.1>  //File Header 
    </FID.4> 
    <FID.5> 
     <FID.5.1>TEST</FID.5.1>  //Owner Last Name 
     <FID.5.2>TEST</FID.5.2>  //Owner First Name 
     <FID.5.3 /> 
     <FID.5.4 /> 
     <FID.5.5 /> 
     <FID.5.6 /> 
     <FID.5.7 /> 
     <FID.5.8 /> 
    </FID.5> 

我想什麼來完成是輸出這兩個值(文件標題)和所有者名稱(Last,First)作爲存儲過程調用的一部分。

輸出:

[FILE_ID]  //From Table 
[FILE_DATE] //From Table 
[FILE_HEADER] //From FILE_CONTENTS in <FID.4.1></FID.4.1> 
[FILE_OWNER] //From FILE_CONTENTS in <FID.5.1></FID.5.1>,<FID.5.2></FID.5.2> 

是它有可能使XML文件(FILE_CONTENTS)或字符串形式(FILE_CONTENTS_STRING)XML文件使用存儲過程中的SQL查詢這種類型的信息?

編輯:第一次嘗試(不成功)

SELECT FILE_ID, 
     FILE_DATE, 
     FILE_CONTENTS.value('(/PID.4/PID.4.1)[1]', 'varchar(16)') as FILE_HEADER, 
     FILE_CONTENTS.value('(/PID.5/PID.5.1)[1]', 'varchar(16)') + ', ' +  
     FILE_CONTENTS.value('(/PID.5/PID.5.2)[1]', 'varchar(16)') as FILE_OWNER 
    FROM [tbFILES] 

其產生NULL爲FILE_HEADERFILE_OWNER字段。我認爲需要更復雜的東西?再次

更新:(!問題解決)

我不得不額外部分添加到XML,因爲所提供的部分本來是一個更大的XML文檔的片段。

回答

1

在此嘗試此查詢 - 是否a)工作和b)做你正在尋找的?

-- test data setup 
DECLARE @test TABLE (FILE_ID INT, FILE_DATE DATETIME, FILE_CONTENTS XML) 

INSERT INTO @test VALUES(4711, '20110414', 
'<FID.4> 
     <FID.4.1>TESTING</FID.4.1>  //File Header 
    </FID.4> 
    <FID.5> 
     <FID.5.1>TEST_LN</FID.5.1>  //Owner Last Name 
     <FID.5.2>TEST_FN</FID.5.2>  //Owner First Name 
     <FID.5.3 /> 
     <FID.5.4 /> 
    </FID.5>') 

-- select the values from the table and cross apply bits from the XML 
SELECT 
    FILE_ID , 
    FILE_DATE , 
    Node.value('(/FID.4/FID.4.1/text())[1]', 'varchar(50)') AS 'File_Header', 
    Node.value('(/FID.5/FID.5.1/text())[1]', 'varchar(50)') + ', ' + 
    Node.value('(/FID.5/FID.5.2/text())[1]', 'varchar(50)') AS 'File_Owner' 
FROM 
    @test 
CROSS APPLY 
    FILE_CONTENTS.nodes('/*') AS Content(Node) 

我的輸出是這樣的:

FILE_ID FILE_DATE    File_Header File_Owner 
4711  2011-04-14 00:00:00.000 TESTING  TEST_LN, TEST_FN 
4711  2011-04-14 00:00:00.000 TESTING  TEST_LN, TEST_FN 

如果你的XML有一個適當的根元素,你很可能使這更好的(在性能方面) - 使用適當的XPath在CROSS APPLY條件來從XML中獲取所需的重複節點位。

+0

嗨馬克,我感謝您的答案,當我試圖使用它時,我收到了File_Header和File_Owner字段中的NULL值。我會繼續嘗試一些微小的變化,希望取得一些進展。 – 2011-04-14 15:58:41

+0

只是一個更新馬克 - 我能夠讓我的原始方法工作(只是使用該值),顯然我不得不進一步看,並添加一個額外的水平到Node.value部分。我感謝您的幫助 :) – 2011-04-14 16:13:52