我正在尝试使用简单的select查询从表中的FIRST_NAME
列获取子字符串ADDRESS_XML
属性值。列类型为varbinary(1000)
。
GetXml
是其他地方定义的自定义方法,效果很好。
我的where子句是
dbo.GetXml(ADDRESS_XML).exist('xpathExpression') = 1
以下是ADDRESS_XML列的一行:
<PostalAddress xmlns="http://tempuri.org/PostalAddress.xsd">
<PostalAddress TITLE="Mr" FIRST_NAME="John" LAST_NAME="SMITH"
ADDRESS="207a Stratford Road, Shirley" CITY="Solihull"
COUNTY="West Midlands" POSTCODE="B90 3AH"
COUNTRY="United Kingdom" CONTACT_INFO=""
EMAIL_ADDRESS="" PHONENO="" />
</PostalAddress>
XPath表达式应该是什么?
我正在使用SQL Server 2008 R2 Express varbinary列将字符串存储为十六进制,这就是我在其上使用专有的GetXml()方法的原因。
答案 0 :(得分:1)
您可以使用sql:variable()
在exist
函数的谓词中使用变量。
declare @FirstName nvarchar(100) = 'John';
with xmlnamespaces(default 'http://tempuri.org/PostalAddress.xsd')
select *
from T
where dbo.GetXml(ADDRESS_XML).exist('/PostalAddress/PostalAddress[@FIRST_NAME = sql:variable("@FirstName")]') = 1;
或者针对xPath中的常量值
with xmlnamespaces(default 'http://tempuri.org/PostalAddress.xsd')
select *
from T
where dbo.GetXml(ADDRESS_XML).exist('/PostalAddress/PostalAddress[@FIRST_NAME = "John"]') = 1;
答案 1 :(得分:0)
因为你问过,这里是获取FIRST_NAME
属性的XPath表达式:
/PostalAddress/PostalAddress/@FIRST_NAME
或者您是否希望<PostalAddress>
FIRST_NAME
属性值等于1
:
/PostalAddress/PostalAddress[@FIRST_NAME='1']
您可能需要先注册默认命名空间(MSDN: Specifying Default Namespace)。但是,我不确定你打算如何准确地使用XPath。