在SQL Server中查询XML列

时间:2014-02-24 10:28:18

标签: sql-server xml sql-server-2012 sqlxml

在xml数据类型的列中,包含以下结构,我想查找表行where v like '%a%'

<PostVar>
  <d n="A" v="abc" />
  <d n="B" v="def" />
  <d n="C" v="ghi" />
  <d n="D" v="jkl" />
  <d n="E" v="mno" />
  <d n="F" v="pqr" />
</PostVar>

我以前使用不同的xml类型: -

<EVENT_INSTANCE>
  <EventType>ALTER_TABLE</EventType>
  <PostTime>2011-09-28T11:47:52.597</PostTime>
  <SPID>105</SPID>
  <ServerName>srv</ServerName>
  <LoginName>sa</LoginName>
  <UserName>dbo</UserName>
  <DatabaseName>server</DatabaseName>
  <SchemaName>tim</SchemaName>
  <ObjectName>_SystemTableVersion</ObjectName>
  <ObjectType>TABLE</ObjectType>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>ALTER TABLE tim._SystemTableVersion ADD
resr datetime NULL
</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>

和我用来“提取”数据的SQL是: -

SELECT
    [ID]
    ,[EventData].value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)')
    , ServerName, ServiceName, RemServer, SUserName, HostName, UserName, SUserSName, SystemUser, SessionUser, OriginalLogin, RecTime
FROM
    dbo.myTable
WHERE
    [EventData].value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)')
        LIKE '%wordImLookingFor%'

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您可以使用exist()contains()

where XMLCol.exist('/PostVar/d/@v[contains(., "a")]') = 1

然而,比较总是区分大小写。

如果您需要检查变量,则应使用sql:variable()

declare @v varchar(10)
set @v = 'a'

select *
from YourTable
where XMLCol.exist('/PostVar/d/@v[contains(., sql:variable("@v"))]') = 1

答案 1 :(得分:0)

我认为以下内容会有所帮助:

select * -- your select list here  
  from mySchema.myTable -- your schema and table name here  
    where myColumn.value('(/PostVar/d/@v)[1]', 'nvarchar(3)') Like '%a%'  

注意:由于您没有指定新表的定义,因此需要替换mySchema,myTable和myColumn以匹配您的方案。

以下链接提供了很好的参考:
http://technet.microsoft.com/en-us/library/ms178030.aspx

问候。