Как получить значение подстроки из столбца Sql типа varbinary?

Я пытаюсь получить подстроку, FIRST_NAME, значение атрибута от ADDRESS_XML столбец в таблице с помощью простого запроса выбора. Тип столбца varbinary(1000),

GetXml это пользовательский метод, определенный в другом месте, который работает нормально.

Мой пункт где

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 ответа

Ты можешь использовать 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;

Так как вы спросили, вот выражение XPath, чтобы получить FIRST_NAME атрибут:

/PostalAddress/PostalAddress/@FIRST_NAME

или если вы хотели получить <PostalAddress> имеющий FIRST_NAME значение атрибута равно 1:

/PostalAddress/PostalAddress[@FIRST_NAME='1']

Может потребоваться сначала зарегистрировать пространство имен по умолчанию ( MSDN: указание пространства имен по умолчанию). Хотя я не уверен, как вы намеревались использовать XPath.

Другие вопросы по тегам