0

-type フィールドを持つ単一のSQLテーブルがあります。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)

4

2 に答える 2

1

このような機能が必要なようです。

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() メソッド (xml データ型)を使用します。

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
于 2013-07-09T13:49:02.540 に答える
0

ドキュメントを探していると思います。

「クエリ」メソッドが必要になる可能性があります。リンクされた記事の例を参照してください。

于 2013-07-09T11:56:29.763 に答える