在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%'
任何帮助将不胜感激。
答案 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
问候。