2013-07-09 108 views
0

有單SQLxml型領域:過濾SQL SELECT通過XML節點


| EntityId | EntityType | Xml column    | 
------------------------------------------------------ 
| 1  | Employee | `<productId>1</productId>`| 
------------------------------------------------------ 
| 1  | Product  | `<name>apple</name>`  | 
------------------------------------------------------ 
| 7  | Shop  | `<country>...</country>` |      | 
-----------------------------------------------------| 

我需要的是一個過濾錶行通過Xml節點值:

SELECT * WHERE (EntityId='1' AND EntityType='Employee') 
OR (EntityId=SomeFuncToGetXmlFieldByNodeName('productId')) 

你能指點我如何寫SomeFuncToGetXmlFieldByNodeName(fieldName)

+0

問題是什麼? –

+0

對不起,表html有點損壞。正如你所看到的,它像3個存儲在1中的表格,其中存儲了它們之間關係的xml字段。我需要得到每一行匹配條件的關聯,並根據該條件選擇額外的行 – dbardakov

+0

很難理解你的問題。你看過MS SQL Server文檔嗎? http://msdn.microsoft.com/en-us/library/ms178030.aspx –

回答

0

看起來像你想要一個這樣的功能。

CREATE FUNCTION [dbo].[SomeFuncToGetXmlFieldByNodeName] 
(
    @NodeName nvarchar(100), 
    @XML xml 
) 
RETURNS nvarchar(max) 
AS 
BEGIN 
    RETURN @XML.value('(*[local-name(.) = sql:variable("@NodeName")]/text())[1]', 'nvarchar(max)') 
END 

它將節點名稱和一些XML作爲參數並返回節點中的值。

使用功能是這樣的:

select T.EntityId, 
     T.EntityType, 
     T.[Xml column] 
from YourTable as T 
where T.EntityID = 1 and 
     T.EntityType = 'Employee' or 
     T.EntityId = dbo.SomeFuncToGetXmlFieldByNodeName('productId', T.[Xml column]) 

除了使用上面我想推薦你嘗試不使用的標量值函數的查詢。它使用exist() Method (xml Data Type)來代替。

select T.EntityId, 
     T.EntityType, 
     T.[Xml column] 
from YourTable as T 
where T.EntityID = 1 and 
     T.EntityType = 'Employee' or 
     T.[Xml column].exist('/productId[. = sql:column("T.EntityID")]') = 1 
+0

看起來正是我想要的。謝謝。我會盡快進行測試。 – dbardakov

0

我認爲你正在尋找documentation

「查詢」方法可能是你需要的。請參閱鏈接文章中的示例。

+0

感謝您的幫助,有關存在(..)和價值(..)方法的信息是有幫助的。我保證,稍後投票時,當我有足夠的聲譽) – dbardakov