2012-09-26 45 views
0

我有一個XML列(稱爲元數據)表的結果看起來像這樣:組由XML查詢

<props> 
    <prop name="bytes" value="194" /> 
    <prop name="error" value="File is a text file" /> 
    <prop name="mime-type" value="text/plain " /> 
</props> 

現在我有一些不同的充的錯誤,我可以用這個在這裏選擇:

SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error, 
     MetaData.value('(/props/prop[@name="mime-type"]/@value)[1]', 'varchar(50)') MimeType, 
     * 
FROM source 
WHERE MetaData.exist('/props/prop[@name="error"]') = 1 

現在我想算一個錯誤多久accours:

SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error, 
     COUNT(*) Count 
FROM source 
WHERE MetaData.exist('/props/prop[@name="error"]') = 1 
GROUP BY Error 

但我得到的錯誤信息:

Meldung 207, Ebene 16, Status 1, Zeile 5
Ungültiger Spaltenname 'Error'.

這意味着類似:無效的列名 '錯誤'

我也試過這個位置:

Select Error, COUNT(Error) FROM (
    SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error 
    FROM videos 
    WHERE MetaData.exist('/props/prop[@name="error"]') = 1 
) 
GROUP BY Error 

但與崩潰:

Meldung 156, Ebene 15, Status 1, Zeile 6
Falsche Syntax in der Nähe des GROUP-Schlüsselworts.

這意味着什麼如:關鍵字附近的語法錯誤GROUP

我該如何解決這個問題?

回答

3

可以在同一查詢中引用別名列的唯一時間是ORDER BY子句。你最後一次嘗試的錯誤是,子查詢必須被賦予一個表別名,我在下面用「X」表示沒有更好的名字。

SELECT Error, COUNT(Error) [Count] 
FROM (
    SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error 
    FROM source 
    WHERE MetaData.exist('/props/prop[@name="error"]') = 1 
) X 
GROUP BY Error 

而且Count是保留字,所以你需要在方括號中,如果你要使用它。

+0

哦不,只是'X'在我的最後一次嘗試中失蹤了。謝謝! – rekire

2

在你的第二個查詢,則需要命名的子查詢

Select Error, COUNT(Error) FROM 
( 
    SELECT MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error 
    FROM videos 
    WHERE MetaData.exist('/props/prop[@name="error"]') = 1 
) subqueryname 
GROUP BY Error 

你可以給它幾乎任何你喜歡的名字。

0

正確。你也像這樣可以:

SELECT error, COUNT(*) errorCount 
FROM 
    (
    SELECT 
     e.c.value ('@value', 'varchar(50)') Error 
    FROM source s 
     CROSS APPLY s.metadata.nodes('props/prop[@name="error"]') e(c) 
    ) x 
GROUP BY error 

你也可以做到這一點使用XQuery,雖然目前尚不清楚如何您希望您預期的結果看。試試這個:

DECLARE @source TABLE (metadata XML) 

INSERT INTO @source 
SELECT '<props> 
    <prop name="bytes" value="194" /> 
    <prop name="error" value="File is a text file" /> 
    <prop name="mime-type" value="text/plain " /> 
</props>' 

INSERT INTO @source 
SELECT '<props> 
    <prop name="bytes" value="0" /> 
    <prop name="error" value="error 1" /> 
    <prop name="error" value="error 2" /> 
    <prop name="mime-type" value="text/plain " /> 
</props>' 

SELECT 
    MetaData.value('(/props/prop[@name="error"]/@value)[1]', 'varchar(50)') Error, 
    MetaData.value('(/props/prop[@name="mime-type"]/@value)[1]', 'varchar(50)') MimeType, 
    MetaData.value('count(/props/prop[@name="error"])', 'int') errorCount, 
    * 
FROM @source 
WHERE MetaData.exist('/props/prop[@name="error"]') = 1 
+0

我想要一個錯誤消息和計數列表。例如。未找到文件:3次。讀取錯誤:10次,依此類推。如果我猜對了,你的sql語句會返回名稱錯誤的'prop'的數目嗎? – rekire