如何从varbinary类型的Sql列获取子字符串值?

时间:2014-09-09 12:58:27

标签: xml tsql types sql-server-2008r2-express

我正在尝试使用简单的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()方法的原因。

2 个答案:

答案 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。